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


事件(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,甚至在复杂系统中同时使用它们来实现不同层次的通信和解耦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/254443.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mybatis中oracle的sql没走索引导致特别慢(未加jdbcType的)

如果直接跑sql是能走索引很快&#xff0c;在mybatis中不能&#xff0c;可能就是jdbcType的原因。 比如&#xff0c;我有一个属性A&#xff0c;在表里面是VARCHAR2类型&#xff0c;但是在mybatis中的sql是#{a}&#xff0c;缺少jdbcTypeJdbcType.VARCHAR&#xff0c;就会导致myba…

risc-v system instruction

ECALL ecall 指令以前叫做 scall&#xff0c;用于执行环境的变更&#xff0c;它会根据当前所处模式触发不同的执行环境切换异常, 用来执行需要更高权限才能执行的功能;简单来说&#xff0c;ecall 指令将权限提升到内核模式并将程序跳转到指定的地址。操作系统内核和应用程序其实…

AD采集卡设计方案:630-基于PCIe的高速模拟AD采集卡

基于PCIe的高速模拟AD采集卡 一、产品概述 基于PCIe的一款分布式高速数据采集系统&#xff0c;实现多路AD的数据采集&#xff0c;并通过PCIe传输到存储计算服务器&#xff0c;实现信号的分析、存储。 北京太速科技&#xff0c;产品固化FPGA逻辑&#xff0c;适配2路…

ShardingSphere-JDBC 和 ShardingSphere-Proxy,你选择哪一个

参考文章 总结&#xff1a; 只使用Java&#xff0c;ShardingSphere-JDBC更好有异构语言的话&#xff0c;ShardingSphere-Proxy 更好混用也挺香

Flink系列之:监控Checkpoint

Flink系列之&#xff1a;监控Checkpoint 一、概览二、概览&#xff08;Overview&#xff09;选项卡三、历史记录&#xff08;History&#xff09;选项卡四、历史记录数量配置五、摘要信息&#xff08;Summary&#xff09;选项卡六、配置信息&#xff08;Configuration&#xff…

100GPTS计划-AI动漫AnimeArtisan

地址 https://poe.com/AnimeArtisan https://chat.openai.com/g/g-LM6ObVhfF-anime-artisan 测试 风景类: 阳光、蓝天、白云、大海、海滩、森林、瀑布、山峰、雪山 日常类: 睡觉、跑步、学习、工作、做家务、看书、听音乐、运动、购物、煮饭 人物类: 女孩、男孩、老人、儿童…

『 Linux 』重新理解挂起状态

文章目录 &#x1f984; 前言新建状态 &#x1f40b;挂起状态 &#x1f40b;唤入唤出 &#x1f40b;进程与操作系统间的联系 &#x1f40b; &#x1f984; 前言 『 Linux 』使用fork函数创建进程与进程状态的查看中提到了对挂起状态的一个理解&#xff1b; ​ 挂起状态相比于其…

爬虫练习-获取imooc课程目录

代码&#xff1a; from bs4 import BeautifulSoup import requests headers{ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.0, }id371 #课程id htmlrequests.get(https://coding.imooc.com/class/chapter/id.html#Anchor,head…

kubernetes 学习笔记

1. Kubernetes 介绍 1.1 应用部署方式的演变 在部署应用程序的方式上&#xff0c;主要经理了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上。虚拟化部署&#xff1a;可以在一台物理机上运行多个虚拟机&#xff0c;每个虚…

高可用接入层技术演化及集群概述

集群概述 集群的介绍及优势 集群&#xff1a;将多台服务器通过硬件或软件的方式组合起来&#xff0c;完成特定的任务&#xff0c;而这些服务器对外表现为一个整体。集群的优势 高可靠性&#xff1a;利用集群管理软件&#xff0c;当主服务器故障时&#xff0c;备份服务器能够自…

Cesium 加载 Geoserver WMS 图层以及条件查询和切换图层样式

Cesium 加载 Geoserver WMS 图层以及条件查询和切换图层样式 图层样式核心代码完整代码&#xff1a;在线示例 Cesium 加载 Geoserver WMS 图层&#xff0c;在实际项目中常常会遇到&#xff0c;需要对图层进行过滤&#xff0c;这里介绍一下过滤方法。 Cesium Geoserver 图层条件…

AirPodsPro3爆料汇总,2025年发布?

不止是iPhone&#xff0c;苹果的AirPods Pro系列耳机也是非常受用户青睐的一款产品&#xff0c;相信不少果粉都非常期待它的升级换代。 第一代AirPods Pro于2019年10月发布&#xff0c;第二代AirPods Pro于2022年9月发布&#xff0c;按照这个时间线来看的话&#xff0c;第三代A…

《Linux C编程实战》笔记:进程操作之创建进程

进程是一个动态的实体&#xff0c;是程序的一次执行过程。进程是操作系统资源分配的基本单位。 以下是一些概念&#xff0c;我就直接抄书了 进程是操作系统的知识&#xff0c;简单理解的话&#xff0c;你写的代码运行起来算一个进程&#xff1f; 创建进程 每个进程由进程ID号…

在vue项目中,数据已经在页面渲染,但在后续操作时获取不到数据

如下图 产生这个问题的原因 异步问题 如何解决 方法一&#xff1a;可以将其存放在一个setTimeout里面&#xff08;利用一个极小的延迟来获取数据&#xff09;&#xff0c;如下图 效果 方法二&#xff1a;将操作放入axios里面&#xff0c;如下图

昂首资本发现原油价差这样用,难怪银行这么富

难怪银行这么富&#xff0c;原来是发现一个稳定产生利益的投资策略。虽然这个利润可能看起来比较少。但是昂首资本需要提醒各位投资者的是&#xff1a;首先&#xff0c;这个策略几乎没有风险。第二&#xff0c;这是一个可以复制的投资策略。 下面昂首资本就通过原油的价差进行实…

开发信怎么写回复率高?写外贸邮件的技巧?

如何打造高回复率的开发信&#xff1f;有效的开发信模板推荐&#xff1f; 如何写一封能够引起客户兴趣并提高回复率的开发信变得至关重要。开发信是建立联系、促进销售和扩大业务的关键工具之一。蜂邮EDM将探讨一些关键策略&#xff0c;帮助你提高开发信的回复率&#xff0c;确…

爬虫图片验证码处理

图片验证码处理 目前&#xff0c;很多网站为了防止爬虫爬取&#xff0c;登录时需要用户输入验证码。下面我们学习如何在爬虫程序中识别验证码。 其中包含验证码。 页面中的验证码图片对应一个<img>元素&#xff0c;即一张图片&#xff0c;浏览器加载完登录页面后&#…

Spring 6(二)【IOC原理】

前言 IOC 是Spring的两大核心概念之一&#xff0c;它是一种思想&#xff0c;需要极其熟练的掌握。 今日摘录&#xff1a; 低能无聊的人太多。说他们勤勉&#xff0c;不过是因困为不会合理分配时间&#xff1b;说他们积极&#xff0c;不过是逃避其他困难工作而已。即便说工作只…

DNN二分类模型

import os import datetime#打印时间 def printbar():nowtime datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)print("\n"""*8 "%s"%nowtime)#mac系统上pytorch和matplotlib在jupyter中同时跑需要更改环境变量 os.environ["KMP_DUP…

【网络安全】-Linux操作系统—操作系统发展历史与Linux

文章目录 操作系统发展历史初期的操作系统分时操作系统个人计算机操作系统 Linux的诞生UNIX与GNU项目Linux内核的创建 Linux的特点开放源代码多样性社区支持 Linux的应用服务器和超级计算机嵌入式系统桌面系统 总结 操作系统发展历史 操作系统&#xff08;Operating System&am…