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连接的应用中使用。

事件总线具有以下特点:

  1. 高度解耦 :通过事件总线,Vert.x中的组件可以相互通信,而无需了解彼此的内部实现细节。这有助于降低系统的复杂性,并提高可维护性和可扩展性。
  2. 分布式能力 :事件总线支持分布式结构,可以将事件总线延伸到不同的Vert.x实例中,实现复杂的分布式应用。这使得Vert.x能够支持大规模、高并发的应用场景。
  3. 集群通信 :通过集群模式启动的Vert.x应用,节点之间可以通过事件总线进行通信,实现共享数据结构、硬件故障检测和负载均衡等功能。
  4. 可靠性 :事件总线提供了一种可靠的消息传递机制,确保消息在传递过程中不会丢失或重复。
  5. 异步通信 :事件总线支持异步通信模式,发送者和接收者可以异步地进行消息传递,提高了系统的并发性能和响应能力。

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的事件总线不支持以下功能:

  1. 消息确认
  2. 消息优先级
  3. 消息持久化
  4. 消息路由
  5. 消息转换规则

事件总线仅用于承载易失性事件,这些事件由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中,事件总线可以应用于许多场景,主要包括构建响应式、高并发、实时数据处理的系统。具体来说,事件总线可以用于以下场景:

  1. 构建物联网(IoT)系统:事件总线可以用于连接和管理物联网设备,实现设备间的通信和数据传递。
  2. 实时数据分析系统:事件总线可以用于实时收集和处理数据,提供实时的数据分析结果。
  3. 机器学习应用:事件总线可以用于实时传递机器学习模型的更新和结果,实现机器学习应用的实时反馈和调整。
  4. 行情分析系统:事件总线可以用于实时传递股票、期货等金融产品的行情数据,提供实时的行情分析结果。
  5. 网络应用程序:事件总线可以用于构建各种类型的网络应用程序,包括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使用指南

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spark精讲】SparkSQL Join选择逻辑

SparkSQL Join选择逻辑 先看JoinSelection的注释 If it is an equi-join, we first look at the join hints w.r.t. the following order: 1. broadcast hint: pick broadcast hash join if the join type is supported. If both sides have the broadc…

四、C#高级特性(动态类型与Expando类)

在C#中,动态类型和ExpandoObject类是两个与运行时类型系统相关的特性,它们提供了更灵活的数据处理能力。 动态类型 动态类型是一种特殊的类型,允许你在运行时解析和操作对象的成员,而不需要在编译时知道这些成员的细节。使用动态…

通讯录排序(结构体)

输入n个朋友的信息&#xff0c;包括姓名、生日、电话号码&#xff0c;本题要求编写程序&#xff0c;按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。 输入格式: 输入第一行给出正整数n&#xff08;<10&#xff09;。随后n行&#xff0c;每行按照“…

【设计模式】解释器模式

一起学习设计模式 目录 前言 一、概述 二、结构 三、案例实现 四、优缺点 五、使用场景 总结 前言 【设计模式】——行为型模式。 一、概述 如上图&#xff0c;设计一个软件用来进行加减计算。我们第一想法就是使用工具类&#xff0c;提供对应的加法和减法的工具方法。 …

vue2中vuex详细使用

1.安装 说明&#xff1a;也就是版本号&#xff0c;一般vue2安装vuex3。 npm i vuex3.6.2 2.搭建架子 执行流程如下&#xff1a; 初始化状态&#xff1a;在state对象中定义了一个名为message的属性&#xff0c;并将其初始值设置为"启动"。 定义变更函数&#xff08…

Kafka(六)消费者

目录 Kafka消费者1 配置消费者bootstrap.serversgroup.idkey.deserializervalue.deserializergroup.instance.idfetch.min.bytes1fetch.max.wait.msfetch.max.bytes57671680 (55 mebibytes)max.poll.record500max.partition.fetch.bytessession.timeout.ms45000 (45 seconds)he…

前台收款单选择的保险公司 提示 往来户不属于该财务组织

前台收款单选择的保险公司 提示 往来户不属于该财务组织 问题避免 新增保险公司的时候&#xff0c;找一个已经存在的保险公司&#xff0c;利用多页签复制的方式来新增 保险公司 不然不能够自动生成 财务客户

selenium三大等待

一、强制等待 1.设置完等待后不管有没有找到元素&#xff0c;都会执行等待&#xff0c;等待结束后才会执行下一步 2.实例&#xff1a; driver webdriver.Chrome()driver.get("https://www.baidu.com")time.sleep(3) # 设置强制等待driver.quit() 二、隐性等待 …

Java与云平台开发:AWS、Azure与GoogleCloud

随着云计算的兴起&#xff0c;越来越多的企业和开发者开始将应用程序迁移到云端。AWS、Azure和Google Cloud是三家主要的云平台提供商&#xff0c;这些云平台提供各种计算资源和服务&#xff0c;帮助开发者构建、运行和扩展应用程序。在本文中&#xff0c;我们将重点讨论Java在…

Python处理音频文件两个非常重要库

pyaudio和sounddevice都是用于Python中音频处理和流的库&#xff0c;允许用户通过他们的API录制、播放和处理音频数据。下面是对这两个库的简要介绍&#xff1a; PyAudio PyAudio 提供了 Python 绑定到 PortAudio&#xff0c;这是一个跨平台的音频I/O库。它允许你很容易地使用…

Python+Torch+FasterCNN网络目标检测识别

程序示例精选 PythonTorchFasterCNN网络目标检测识别 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonTorchFasterCNN网络目标检测识别》编写代码&#xff0c;代码整洁&#xff0c;规…

SQL Server从0到1——写shell

xp_cmdshell 查看能否使用xpcmd_shell&#xff1b; select count(*) from master.dbo.sysobjects where xtype x and name xp_cmdshell 直接使用xpcmd_shell执行命令&#xff1a; EXEC master.dbo.xp_cmdshell whoami 发现居然无法使用 查看是否存在xp_cmdshell: EXEC…

LeetCode 每日一题 Day 36 ||模拟/字典序(哈希策略)

383. 赎金信 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1…

PyQT5+MySQL的学生信息管理系统【附源码,运行简单】

PyQT5MySQL的学生信息管理系统【附源码&#xff0c;运行简单】 总览 1、《学生成绩管理系统》1.1 方案设计说明书设计目标需求分析工具列表 2、详细设计2.1 登录2.2 程序主页面2.3 学生新增界面2.4 学生更改界面2.4 学生删除界面2.5 其他功能贴图 3、下载 总览 自己做的项目&a…

C语言 设置控制台字体及背景颜色

颜色函数SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),前景色 | 背景色 | 前景加强 | 背景加强); 前景色&#xff1a;数字0-15 或 FOREGROUND_XXX 表示 &#xff08;其中XXX可用BLUE、RED、GREEN表示&#xff09; 前景加强&#xff1a;数字8 或 FOREGROUND_INTENS…

使用Docker-Compose部署MySQL一主二从同步高可用MHA集群

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容准备mysql一主二从同步集群一主二从同步集群规划需要安装docker和docker-compose命令形式安装安装docker安装docker-compose 宝塔面板形式安装 部署Master节点的docker-compose.yaml文件部署MySQL从节点1的docker-compose.…

QOS(Quality of Service)基本原理及配置示例

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 由于QOS&#xff08;Quality of Service&#xff09;在报文上主要是更改特定字段进行流量的差异化服务&#xff0c;因此此处重点介绍各种服…

使用 C# Winfrom编写倒计时功能

在日常生活中&#xff0c;我们经常需要倒计时来提醒自己重要的时间节点&#xff0c;比如倒计时到达一个特定的日期和时间。介绍一个使用 C# 编写的倒计时应用程序的实现。 步骤一&#xff1a;应用程序的功能 它具有以下几个主要特点&#xff1a; 用户输入目标日期和时间&…

从零实现CLIP模型

1. 引言 CLIP代表语言图像对比预训练模型&#xff0c;是OpenAI于2021年开发的一个深度学习模型。CLIP模型中图像和文本嵌入共享相同的潜在特征空间&#xff0c;从而能够在两种模式之间直接进行对比学习。这是通过训练模型使相关的图像和文本更紧密地结合在一起&#xff0c;同时…

浅谈 JVM 类加载过程

&#x1f697;&#x1f697;&#x1f697;今天给大家分享的是HTTPS加密的工作过程。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; ✈️✈…