一文弄懂事件Event与Kafka的区别

2023-12-19


事件(Event)和 Apache Kafka 是两个概念层面上有所不同的东西,它们在应用程序中的作用和使用场景也有很大的差异。

1. 概念和定义

事件(Event): 事件是 系统内发生 的特定事情或状态变化的表示。在编程和软件设计中,事件通常被用于解耦系统中的不同部分,以及在不同模块之间传递信息。事件可以是内建的,也可以是自定义的。

Kafka: Apache Kafka 是一个分布式流处理平台,主要用于构建实时数据管道和流应用程序。它提供了持久性、容错性、伸缩性和高吞吐量的消息传递系统,通过分布式发布-订阅机制,允许 多个应用程序或服务之间以实时的方式交换数据

2. 应用场景

事件: 事件通常用于处理应用程序内部的状态变化或业务逻辑触发的行为。例如,用户注册成功、订单支付完成等都可以作为事件在应用内部传播。

Kafka: Kafka 通常用于处理系统之间的异步消息传递,特别是在分布式和微服务架构中。它使得不同服务可以通过消息传递方式进行解耦,实现松耦合的系统架构。

3. 通信方式

事件: 事件通常通过事件发布者和事件监听器之间的 观察者模式 进行通信。事件发布者发布事件,而监听器监听并响应这些事件。

Kafka: Kafka 使用 发布-订阅模型 ,其中消息生产者发布消息到 Kafka 主题,而消息消费者从主题中订阅并消费这些消息。这是一种分布式的、异步的通信方式。

4. 消息传递方式

事件: 事件通常是 同步的 ,即事件发布者发布事件后,会等待事件监听器处理完成。这是在单个应用程序内的同步通信方式。

Kafka: Kafka 提供 异步 的消息传递方式,消息生产者将消息发布到主题后不需要等待消费者的响应。这种异步性质使得 Kafka 非常适合处理大量实时数据的场景。

5. 数据持久性

事件: 事件通常是瞬时的,只在应用程序内传递,并不具备持久性。

Kafka: Kafka 提供持久性存储,消息被持久化到 Kafka 主题中,允许消息在一段时间内被多个消费者消费,保证了数据的持久性。

6 事件(Event)的工作原理和实现

工作原理:
事件定义: 事件是应用程序内的特定事情或状态变化的表示,通常通过继承 ApplicationEvent 类或实现 ApplicationEvent 接口来定义。

事件发布: 当事件发生时,通过 Spring 的 ApplicationEventPublisher 接口将事件发布到应用程序上下文。

监听器注册: 使用 @EventListener 注解标注的方法会被注册为事件监听器,监听特定类型的事件。

事件处理: 当事件被发布时,与之关联的监听器方法将被调用,执行事件处理逻辑。

// 定义事件
public class MyCustomEvent extends ApplicationEvent {
    public MyCustomEvent(Object source) {
        super(source);
    }
}

// 事件发布者
@Component
public class MyEventPublisher {
    @Autowired
    private ApplicationEventPublisher eventPublisher;

    public void publishEvent() {
        MyCustomEvent event = new MyCustomEvent(this);
        eventPublisher.publishEvent(event);
    }
}

// 事件监听器
@Component
public class MyEventListener {
    @EventListener
    public void handleEvent(MyCustomEvent event) {
        // 处理事件逻辑
    }
}

7 Apache Kafka 的工作原理和实现

工作原理:
Kafka 主题: Kafka 使用主题(Topic)来组织消息,消息生产者将消息发布到主题,而消息消费者从主题中订阅消息。

消息生产: 消息生产者将消息发送到 Kafka 主题,消息可以是任意格式的字节流。

消息消费: 消息消费者通过订阅 Kafka 主题,从中拉取消息。每个消费者都有自己的消费者组(Consumer Group)。

分区和副本: Kafka 主题可以分为多个分区,每个分区可以有多个副本。这提供了数据的横向伸缩和容错性。

// Kafka 生产者
public class KafkaProducerExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "localhost:9092");
        properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        Producer<String, String> producer = new KafkaProducer<>(properties);

        ProducerRecord<String, String> record = new ProducerRecord<>("my_topic", "key", "value");

        producer.send(record);
        producer.close();
    }
}

// Kafka 消费者
public class KafkaConsumerExample {
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "localhost:9092");
        properties.put("group.id", "my_group");
        properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);

        consumer.subscribe(Arrays.asList("my_topic"));

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                // 处理接收到的消息
                System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
            }
        }
    }
}

Kafka 生产者将消息发送到名为 "my_topic" 的主题,并且消费者从该主题中订阅并处理消息。

总结:

事件和 Kafka 是两个不同层面的概念,事件通常用于应用程序内部的状态变化,而 Kafka 则是一个分布式消息系统,用于实现不同系统或服务之间的异步消息传递。在系统设计中,可以根据具体需求选择使用事件或 Kafka,甚至在复杂系统中同时使用它们来实现不同层次的通信和解耦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文弄懂事件Event与Kafka的区别 的相关文章

随机推荐

  • 有没有免费好用的进销存管理系统?

    有没有免费好用的进销存管理系统 要 好用 还要 免费 这样的进销存系统选型策略 到最后是 一箭双雕 还是 鱼与熊掌不可兼得 呢 让我们从好用和免费开始 慢慢分析 免费和好用能共存吗 怎么才算是好用的进销存系统 推荐一款好用的 订阅制付费的系
  • 第六章--- 实现微服务:匹配系统(下)

    0 写在前面 这一章终于完了 但是收尾工作真的好难呀QAQ 可能是我初学的缘故 有些JAVA方面的特性不是很清楚 只能依葫芦画瓢地模仿着用 特别是JAVA的注解 感觉好多但又不是很懂其中的原理 只知道要在某个时候用某个注解 我真是有够菜的
  • React中渲染html结构---dangerouslySetInnerHTML

    dangerouslySetInnerHTML 胡子 语法绑定的内容全部作为普通文本渲染 渲染html结构基于 dangerouslySetInnerHTML dangerouslySetInnerHTML 是 React 标签的一个属性
  • 漏洞复现-某友CRM系统某接口存在任意文件读取(附漏洞检测脚本)

    免责声明 文章中涉及的漏洞均已修复 敏感信息 均已做打码处理 文章仅做 经验分享 用途 切勿当真 未授权的攻击属于非法行为 文章中 敏感信息 均已做多层打马处理 传播 利用本文章所提供的信息而造成的任何直接或者间接的后果及损失 均由使用者本
  • 为啥都说信息安全缺人,但招聘时招安全的却不多?

    为什么会形成这样一个扭曲的状况 因为我们现在说 信息安全缺人 一般是指 缺口 很大 而不是指 需求 很大 比如某小型 云服务 供应商 一共也就大概几百台物理机器 每隔四五个月才喊人来手动升级一下系统 打打补丁 要是补丁打得不及时导致用户被黑
  • Python 如何在测试中使用 Mock

    Mock概念 mock 的意思是模拟 也就是模拟接口返回的信息 用已有的信息替换它需要返回的信息 从实现对所依赖的模块的测试 一般有两种场景 前端对后端接口的 mock 后端服务之间的测试中涉及的mock 常常发生在单元测试的时候 前端mo
  • 漏侧是能力问题?

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 聊聊Compose框架在UI测试自动化中的优点及示例

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Python的元编程之动态类创建和修改

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • 企业电子招投标采购系统源码之鸿鹄电子招投标系统+电子招投标的组成

    招投标管理系统是一款适用于招标代理 政府采购 企业采购和工程交易等领域的企业级应用平台 该平台以项目为主线 从项目立项到项目归档 实现了全流程的高效沟通和协作 通过该平台 用户可以实时共享项目数据信息 实现规范化管理和有效监控 协同工作网络
  • 【实战详解】如何快速搭建接口自动化测试框架?Python + Requests

    摘要 本文主要介绍如何使用Python语言和Requests库进行接口自动化测试 并提供详细的代码示例和操作步骤 希望能对读者有所启发和帮助 前言 随着移动互联网的快速发展 越来越多的应用程序采用Web API 也称为RESTful API
  • 车载测试ADAS-常用场景仿真软件

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Web自动化测试流程:从入门到精通,帮你成为测试专家

    摘要 Web应用程序在今天的软件开发中占据着越来越重要的地位 保证Web应用程序的质量和稳定性是非常必要的 而自动化测试是一种有效的方法 本文将介绍Web自动化测试流程 并提供代码示例 步骤一 选取测试工具 选择适合自己团队的自动化测试工具
  • 计算智能 | 蚁群算法——旅行商问题(TSP)python

    目录 一 求解TSP city31 问题的python代码 二 python运行结果 一 求解TSP city31 问题的python代码 import numpy as np import random import matplotlib
  • ArrayList 扩容机制

    2023 12 18 ArrayList的构造函数 ArrayList 默认创建长度为0的数组 ArrayList int initialCapacity 创建指定容量的数组 ArrayList Collection
  • 企业电子招标采购系统源码Spring Cloud + Spring Boot + 前后端分离 + 二次开发

    项目说明 随着公司的快速发展 企业人员和经营规模不断壮大 公司对内部招采管理的提升提出了更高的要求 在企业里建立一个公平 公开 公正的采购环境 最大限度控制采购成本至关重要 符合国家电子招投标法律法规及相关规范 以及审计监督要求 通过电子化
  • 求你了!别再问我怎么学 Python 了

    很多小伙伴问如何学习 Python 哪里可以找到实战的 Python 项目 有没有爬虫案例等等 今天给大家分享一份我整理的 Python 项目大全学习资料 文末有获取方式 话不多说 直接上干货 首先 全部资料目录压缩 由于内容较多 这里也仅
  • 去除微信小程序里button的边框

    去除微信小程序里面的button边框 方法一 通过button after button after border none 方法二 给button按钮加上plain属性 属性值为true
  • 【光伏预测】基于遗传优化注意力机制的长短时记忆神经网络GA-attention-LSTM实现数据回归预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 代码获取 论文复现及科研仿真合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab完整代码及仿真定制内容点击 智能优化算法 神经网络预测 雷达通信
  • 一文弄懂事件Event与Kafka的区别

    事件 Event 和 Apache Kafka 是两个概念层面上有所不同的东西 它们在应用程序中的作用和使用场景也有很大的差异 1 概念和定义 事件 Event 事件是 系统内发生 的特定事情或状态变化的表示 在编程和软件设计中 事件通常被