Vert.x学习笔记-什么是事件总线
- 广义事件总线介绍
- Vert.x的事件总线
- Vert.x的事件总线的实现方式
- Vert.x的事件总线通信模式
- 事件总线与消息队列的区别
- 点对点通信模式
- 请求-应答通信模式
- 发布-订阅通信模式
- Vert.x的事件总线应用场景
- Vert.x的事件总线消息
- Vert.x的事件总线消息示例
- Vert.x的事件总线的消息类型
- 拓展
广义事件总线介绍
事件总线是一种集中式事件处理机制,它允许不同的组件之间进行彼此通信而又不需要相互依赖,从而达到解耦的目的。它是对发布-订阅模式的一种实现,可以看作是一个中心化的媒介,能够以标准化的协议在这些组件之间路由事件,负责将事件从发布者传递给订阅者。事件总线可以管理事件的传递、路由和解析,同时也可以处理事件的顺序、优先级和过滤。
在事件驱动型架构中,事件总线是其中的一部分,它主要用于处理事件发布和订阅的中间件。它通过提供统一的订阅、取消订阅和发布接口,使不同组件或模块之间能够进行松散耦合的通信。
事件总线的设计基于观察者模式的思想,使用发布-订阅的方式支持组件和模块间的通讯,摒弃了观察者模式需要显示回调的缺点。在事件总线上,事件被发送到一个总线上,然后由订阅该事件的订阅者处理。订阅者不仅可以接收和消费事件,它们本身也可以创建事件,并将它们发送到事件总线上。
事件总线还可以维护一个事件源与事件处理的映射字典,提供统一的订阅、取消订阅和发布接口。事件是一个普通的POJO类,只包含数据,不包含对数据的操作。订阅者存在优先级,优先级高的订阅者可以取消事件继续向优先级低的订阅者分发,默认所有订阅者优先级都为0。总线负责订阅者、事件等信息的存储,同时处理事件的流动和分发,通过总线,订阅者和发布者是解耦的,互不知道对方的存在。
Vert.x的事件总线
Vert.x是一个基于事件驱动的开源框架,用于构建响应式应用。在Vert.x中,事件总线是一个核心概念,用于实现不同组件之间的通信和数据传递。
事件总线是一个消息传递平台,允许Vert.x中的各个组件(Verticle)通过发布和订阅事件来进行通信。它类似于消息队列,但更灵活,支持发布-订阅和点对点两种消息传递模式。
在Vert.x中,每个事件都有一个唯一的地址(address),发布者将消息发送到该地址,订阅者则监听该地址的消息。事件总线独立于应用系统,使用TCP协议进行通信,因此可以在任何能够创建TCP连接的应用中使用。
事件总线具有以下特点:
- 高度解耦 :通过事件总线,Vert.x中的组件可以相互通信,而无需了解彼此的内部实现细节。这有助于降低系统的复杂性,并提高可维护性和可扩展性。
- 分布式能力 :事件总线支持分布式结构,可以将事件总线延伸到不同的Vert.x实例中,实现复杂的分布式应用。这使得Vert.x能够支持大规模、高并发的应用场景。
- 集群通信 :通过集群模式启动的Vert.x应用,节点之间可以通过事件总线进行通信,实现共享数据结构、硬件故障检测和负载均衡等功能。
- 可靠性 :事件总线提供了一种可靠的消息传递机制,确保消息在传递过程中不会丢失或重复。
- 异步通信 :事件总线支持异步通信模式,发送者和接收者可以异步地进行消息传递,提高了系统的并发性能和响应能力。
Vert.x中的事件总线是一个强大而灵活的消息传递平台,为构建响应式应用提供了坚实的基础。通过事件总线,Vert.x能够实现高度解耦的组件通信、分布式能力、集群通信和异步通信等功能,从而满足各种复杂的应用需求。
Vert.x的事件总线的实现方式
在Vert.x中,事件总线的实现方式是通过Vert.x的事件模型。具体来说,事件总线是Vert.x的神经系统,负责应用系统消息的传递。每个事件在事件总线上都有一个唯一的地址(address),发布者向该地址发送消息,而订阅者则监听该地址的消息。
每个Verticle(Vert.x的模块)都可以发布和订阅事件,通过事件总线进行通信和数据传递。这种通信方式使得Vert.x中的模块高度解耦,降低了系统的复杂性,并提高了可维护性和可扩展性。
事件总线使用TCP协议进行通信,因此可以在任何能够创建TCP连接的应用中使用。此外,事件总线还支持分布式结构,可以将事件总线延伸到不同的Vert.x实例中,实现复杂的分布式应用。
在Vert.x中,可以通过简单的API来使用事件总线。例如,可以使用vertx.eventBus().send()
方法发送消息,使用vertx.eventBus().registerHandler()
方法注册消息处理器等。
Vert.x的事件总线提供了一种灵活、可靠的消息传递机制,使得Vert.x能够构建高性能、可扩展的应用。
Vert.x的事件总线通信模式
事件总线与消息队列的区别
Vert.x的事件总线和我们在开发中常用的消息队列有非常多的相似之处,但是事件总线并不是消息队列,Vert.x的事件总线并不能替代 RabbitMQ 、Kafka等这些消息队列,事件总线和消息队列是两种不同的消息传递模式,它们在功能和实现上有一些区别。
- 事件总线(Event Bus):
事件总线通常用于系统或进程内部,作为组件之间通信的机制。它采用发布-订阅模式,允许发布者发布事件,而多个订阅者可以监听这些事件。事件总线具有广播性质,一个事件一旦发布,所有订阅了该事件的订阅者都会收到消息。事件总线通常用于解耦组件间的依赖关系,使组件可以独立地开发和部署。主要用于应用程序内的各Verticle间的通信,而不是应用程序间的通信,Vert.x的事件总线不支持以下功能:
- 消息确认
- 消息优先级
- 消息持久化
- 消息路由
- 消息转换规则
事件总线仅用于承载易失性事件,这些事件由Verticle异步的进行处理
- 消息队列(Message Queue):
消息队列是一种更古老的消息传递模式,其特点是消息的传递是异步的。生产者将消息放入队列,而消费者从队列中获取并处理这些消息。消息队列保证了消息的有序性和可靠性,同时提供了消息的持久化和事务处理等功能。在分布式系统中,消息队列可以作为各个组件间通信的桥梁,用于集成不同的服务或系统。
- 总结:
事件总线和消息队列的区别主要在于其使用场景和特点。事件总线主要用于系统或进程内部的组件间通信,强调解耦和灵活性;而消息队列则主要用于分布式系统中的跨服务或跨系统间的通信,更注重消息的可靠性和有序性。在实际应用中,可以根据需要选择适合的消息传递模式。
- 事件总线通信模式
- 点对点通信模式(Point-to-Point Messaging)
- 请求-应答通信模式(Request-Reply Messaging)
- 发布-订阅通信模式(Publish-Subscribe Messaging)
点对点通信模式
在“点对点”模式下,消息从生产者发送到各个目标地址,如图的a.b.c目标地址可以是任意格式的字符串, Vert.x 社区的默认约定是使用点号分隔的字符串。在“点对点”通信中,如果存在多个消费者,则只有一个会取得消息和处理消息。图中的消息 M1、M2、M3 展示了这一场景。
消息通常以循环调度方式在消费者之间分发,因此消费者可以均等地分担消息处理工作。所以在图中,第一个消费者处理 M1,而第二个消费者处理 M2、M3。注意,你可能会想,给负担过重的消费者少发一些消息,但是“点对点”模式并没有提供这样的平衡机制。
请求-应答通信模式
在 Vert.x 中,“请求-应答”通信是“点对点”通信的变体。在“点对点”消息通信中,发送一条消息时可以同时注册一个应答程序。执行过程中,事件总线将生成一个临时目标地址,专门用于该消息创建者与消费者(最终接收和处理该消息)之间的通信。
这种消息通信模式适用于模拟 RPC(远程过程调用),只不过响应是以异步方式发送的,因此请求方不需要一直等待响应返回,
这种模式如图所示。当一条消息需要回复时,事件总线会生成一个回复地址,并在消息到达消费者之前将该地址附加到消息中。需要的话,也可通过事件总线提供的 API来查看该回复地址,但实际场景中很少需要知道这个地址,我们只需要在消息对象上调用 reply 方法。当然,在使用此模式时,消费者这一端需要编程来提供答复。
发布-订阅通信模式
在“发布-订阅”通信模式中,生产者和消费者之间具备更高程度的解耦。当消息目标地址时,所有订阅者都会收到它,如图所示。消息 M1、M2 和 M3 由不同的生产送,并且所有订阅者都会接收到消息,这与“点对点”消息通信不同。另外也不能为事件总线上的“发布-订阅”通信指定答复程序。
当你不确定有多少个 Verticle 及其处理程序对某个事件感兴趣时,可使用“发布-订阅式。如果你需要消息的消费者给消息的发送方发送回复,则请使用“请求-应答”模式。究竟选择“点对点”模式,还是“发布-订阅”模式,这是一个功能需求问题,主要取决件是需要交给所有消费者处理,还是只需要交给某一个消费者处理。
Vert.x的事件总线应用场景
在Vert.x中,事件总线可以应用于许多场景,主要包括构建响应式、高并发、实时数据处理的系统。具体来说,事件总线可以用于以下场景:
- 构建物联网(IoT)系统:事件总线可以用于连接和管理物联网设备,实现设备间的通信和数据传递。
- 实时数据分析系统:事件总线可以用于实时收集和处理数据,提供实时的数据分析结果。
- 机器学习应用:事件总线可以用于实时传递机器学习模型的更新和结果,实现机器学习应用的实时反馈和调整。
- 行情分析系统:事件总线可以用于实时传递股票、期货等金融产品的行情数据,提供实时的行情分析结果。
- 网络应用程序:事件总线可以用于构建各种类型的网络应用程序,包括Web应用、RESTful服务、消息队列、实时通信、游戏服务器等。
总之,事件总线在Vert.x中提供了一种灵活、可靠的消息传递机制,使得Vert.x能够构建高性能、可扩展的应用。
Vert.x的事件总线消息
Vert.x的事件总线消息示例
下面是一个使用Vert.x的事件总线示例,其中有两个Verticle:SenderVerticle和ReceiverVerticle。SenderVerticle发布事件,ReceiverVerticle订阅事件并处理它。
public class SenderVerticle extends Verticle {@Overridepublic void start() {vertx.eventBus().send("my.address", "Hello, Vert.x!");}
}public class ReceiverVerticle extends Verticle {@Overridepublic void start() {vertx.eventBus().consumer("my.address", message -> {String body = message.body().toString();System.out.println("Received message: " + body);});}
}public class Main {public static void main(String[] args) {Vertx vertx = Vertx.vertx();vertx.deployVerticle(new SenderVerticle());vertx.deployVerticle(new ReceiverVerticle());}
}
在这个示例中,SenderVerticle向地址"my.address"发送一条消息"Hello, Vert.x!",而ReceiverVerticle订阅该地址,并打印接收到的消息。通过事件总线,SenderVerticle和ReceiverVerticle可以解耦地进行通信。
Vert.x的事件总线的消息类型
在Vert.x中,事件总线的消息类型可以是任何Object,包括Boolean、String等基本类型,也可以是自定义类型的消息。这些消息可以用来传递各种数据,例如状态更新、事件处理结果、消息确认等。
事件总线的消息类型是动态的,可以根据实际需要定义不同的消息类型。例如,在物联网系统中,事件总线的消息类型可以是传感器数据、控制指令等;在网络应用程序中,事件总线的消息类型可以是用户输入、服务器响应等。
在Vert.x中,事件总线的消息类型是通过消息通道来区分的。每个消息通道都有一个唯一的名称,用于标识不同类型的消息。订阅者可以根据需要订阅不同的消息通道,从而接收不同类型的消息。发布者则通过指定消息通道的名称来发布不同类型的消息。
事件总线的消息类型是灵活的,可以根据实际需要定义不同的消息类型,从而实现各种不同的应用场景。
拓展
下面是与Vert.x相关的一些其它博文链接,希望可以帮助大家进一步的了解Vert.x的相关知识
Vert.x学习笔记-异步编程和响应式系统
Vert.x学习笔记-什么是Vert.x
Vert.x学习笔记-Vert.x的基本处理单元Verticle
RabbitMQ使用指南
Kafka使用指南
相关文章:

Vert.x学习笔记-什么是事件总线
广义事件总线介绍Vert.x的事件总线Vert.x的事件总线的实现方式Vert.x的事件总线通信模式事件总线与消息队列的区别点对点通信模式请求-应答通信模式发布-订阅通信模式 Vert.x的事件总线应用场景Vert.x的事件总线消息Vert.x的事件总线消息示例Vert.x的事件总线的消息类型 拓展 广…...

STM32学习笔记二十二:WS2812制作像素游戏屏-飞行射击游戏(12)总结
至此,飞行射击游戏已经基本实现该有的功能,已经比较接近早期的商业游戏了。 如果采用脚本,可以完成关卡游戏,如果不用,也可以做成无限挑战游戏。 我们汇总一下制作的过程: 1、建模UML 2、主循环处理过程…...

astadmin安装querylist插件Puppeteer
我本来是想在linux服务器上安装,折腾了一天也没安装成功,由于急着用,就先做window10上安装了,以后有时间再研究centos7上安装 一 首先需要安装fastadmin 框架和querylist插件 这个大家可以自行安装,querylist安装地址…...

Python从入门到网络爬虫(MySQL链接)
前言 在实际数据分析和建模过程中,我们通常需要从数据库中读取数据,并将其转化为 Pandas dataframe 对象进行进一步处理。而 MySQL 数据库是最常用的关系型数据库之一,因此在 Python 中如何连接 MySQL 数据库并查询数据成为了一个重要的问题…...

2020年认证杯SPSSPRO杯数学建模A题(第二阶段)听音辨位全过程文档及程序
2020年认证杯SPSSPRO杯数学建模 A题 听音辨位 原题再现: 把若干 (⩾ 1) 支同样型号的麦克风固定安装在一个刚性的枝形架子上 (架子下面带万向轮,在平地上可以被水平推动或旋转,但不会歪斜),这样的设备称为一个麦克风树。不同的麦…...

深入理解CRON表达式:时间调度的艺术
😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…...

网络安全—模拟IP代理隐藏身份
文章目录 网络拓扑安装使用代理服务器设置隐藏者设置 使用古老的ccproxy实现代理服务器,仅做实验用途,禁止做违法犯罪的事情,后果自负。 网络拓扑 均使用Windows Server 2003系统 Router 外网IP:使用NAT模式 IP DHCP自动分配或者…...
Resilience4j相关问题及答案(2024)
1、什么是Resilience4j,与Hystrix有何不同? Resilience4j是一个为Java 8和函数式编程设计的故障恢复库,它主要利用了Vavr库中的函数式编程概念。Resilience4j提供了一系列的故障恢复机制,包括断路器(Circuit Breaker&…...

XSKY SDS 产品率先获得 OceanBase V4 新版本认证
近日,北京奥星贝斯科技有限公司(简称:OceanBase)与北京星辰天合科技股份有限公司(简称:XSKY 星辰天合)顺利完成产品兼容性认证。 XSKY 的高性能全闪存储以及混闪存储,与 OceanBase V…...
系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[基础知识]
分类目录:《系统学习Python》总目录 我们可以在类中定义两种方法,它们不需要一个实例就可以被调用:静态方法(staticmethod)大致与一个类中简单的无实例函数的工作方式类似,而类方法则被传人一个类而不是一个…...
kotlin isEmpty/isNotEmpty/isNullOrEmpty和isBlank/isNotBlank/isNullOrBlank
kotlin 中 isEmpty :如果判断的字符为空返回值返回true否则返回false 它的源码 kotlin.internal.InlineOnly public inline fun CharSequence.isEmpty(): Boolean length 0 length 0: 首先检查字符序列的长度是否为 0。如果长度为 0,则表明这个字…...

Qt/QML编程学习之心得:Linux下USB接口使用(25)
很多linux嵌入式系统都有USB接口,那么如何使用USB接口呢? 首先,linux的底层驱动要支持,在linux kernal目录下可以找到对应的dts文件,(device tree) usb0: usb@ee520000{compatible = "myusb,musb";status = "disabled";reg = <0xEE520000 0x100…...

概率论与数理统计 知识点+课后习题
文章目录 💖 [学习资源整合](https://www.cnblogs.com/duisheng/p/17872980.html)📚 总复习📙 选择题📙 填空题📙 大题1. 概率2. 概率3. 概率4. P5. 概率6. 概率密度函数 F ( X ) F(X) F(X)7. 分布列求方差 V ( X ) …...
Spring Boot实战:深入理解@Service与@Mapper注解
1. Service 注解 Service 是Spring框架提供的一个注解,用于标记类为业务逻辑层的组件。当类上标注了Service注解后,Spring容器会自动扫描并创建该类的一个实例(即Bean),这样我们就可以在其他地方通过自动装配…...

【DevOps-06】Jenkins实现CI/CD操作
一、简要说明 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成 基于Jenkins拉取GitLab指定发行版本的SpringBoot代码进行构建发布到生产环境实现CD实现持续部署 二、准备Springboot工程 1、IDEA新建工程 2、填写项目工程信息 3、选择Springboot版本…...

华为面经总结
为了帮助大家更好的应对面试,我整理了往年华为校招面试的题目,供大家参考~ 面经1 技术一面 自我介绍说下项目中的难点volatile和synchronized的区别, 问的比较细大顶堆小顶堆怎么删除根节点CSRF攻击是什么,怎么预防线程通信方式…...

大模型实战营Day1 书生·浦语大模型全链路开源体系
1.大模型为发展通用人工智能的重要途经 专用模型:针对特定任务解决特定问题 通用大模型:一个模型对应多模态多任务 2.InternLM大模型开源历程 3.InternLM-20B大模型性能 4.从模型到应用:智能客服、个人助手、行业应用 5.书生浦语全链条开源…...
Java 集合面试题真实场景还原
Java 集合面试题真实场景还原 文章目录 Java 集合面试题真实场景还原Java常见的集合类ListHashMap Java常见的集合类 面试官:说一说Java提供的常见集合?(画一下集合结构图) 候选人: 嗯~~,好的。 在java中提…...
AutoSAR(基础入门篇)4.9-Autoar_BSW小结
Autoar_BSW小结 Autoar_BSW小结 一、Autoar_BSW小结 1、BSW组件图 2、BSW的功能概述 3、BSW在工程里的应用实际工程...

Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中
场景 SpringBootVue整合WebSocket实现前后端消息推送: SpringBootVue整合WebSocket实现前后端消息推送_websocket vue3.0 springboot 往客户端推送-CSDN博客 上面实现ws推送数据流程后,需要在windows上使用ws客户端定时记录收到的数据到文件中&#x…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...