基于Pub/Sub的事件驱动
1 简介
本文将讨论事件驱动架构 (EDA) 及其最常用的消息传递模式:发布/订阅 (pub/sub)。
我们将解释这些系统中的事情是如何运作的,它们与所谓的传统方法有什么区别,以及它们何时合适。
利用事件驱动架构进行实时通信的通信协议之一是 WebSockets。
事件驱动型架构是一种连接分布式软件系统并允许高效通信的设计模型。EDA 使实时或近乎实时地交换信息成为可能。
在设计依赖微服务的应用程序时(当每个服务都运行自己的进程时),这种情况很常见。
事件驱动架构的概念主要通过发布 / 订阅通信模型来实现。
发布/订阅是一种灵活的消息传递模式,它允许不同的系统组件异步地相互交互。它通常由以下组件构成
发布者:生成和发送消息的实体。
订阅者:接收和使用消息的实体。
主题:消息发布到的频道或类别。
Message Brokers:管理发布者和订阅者之间的消息路由的中介。
这里的关键点是 pub/sub 使计算机能够在数据更新发生时进行通信并做出反应。
这与传统的请求/响应消息传递模式形成鲜明对比,在传统的请求/响应消息传递模式中,数据会定期更新,作为对用户发起的请求的响应。
2 实现示例
始终有两个参与者 — 客户端和服务器。
客户端通过 HTTP 协议进行调用,并等待服务器响应请求的内容。
var redisClient = redis.NewClient(&redis.Options{
Addr: "localhost:6379",
})
func main() {
r := gin.Default()
r.POST("/publish", publishToRedis)
go subscribeToRedis()
r.Run(":8082")
}
func publishToRedis(c *gin.Context) {
event := c.PostForm("event")
err := redisClient.Publish(context.Background(), "events", event).Err()
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "failed to publish event"})
return
}
c.JSON(http.StatusOK, gin.H{"message": "event published"})
}
func subscribeToRedis() {
pubsub := redisClient.Subscribe(context.Background(), "events")
defer pubsub.Close()
ch := pubsub.Channel()
for msg := range ch {
log.Println("Received Redis event:", msg.Payload)
}
}
Pub/Sub (Publisher/Subscriber) 架构广泛应用于组件之间需要异步、可扩展通信的各种场景。Pub/Sub 架构的一些常见用例包括:
实时数据流:它通常用于处理实时数据的应用程序,例如 IoT 设备和传感器网络,允许多个订阅者立即获取数据流。
事件驱动型架构:此设置适用于对事件做出反应的系统,而不是不断检查更新,从而提高应用程序的响应速度。
消息队列:Pub/Sub 可以充当消息队列,暂时保留消息,直到订阅者可以处理它们,这有助于管理消息的传递方式。
通知和警报: 它用于发送通知和警报,让发布者发送订阅者可以立即接收的重要更新。
可扩展的 Web 应用程序:在 Web 应用程序中,Pub/Sub 支持实时更新和聊天等功能,因此许多用户可以同时接收信息,而不会使服务器过载。
微服务通信:最后,它帮助微服务相互通信,允许它们在不紧密连接的情况下进行通信,从而提高可扩展性和可靠性。
3 发布/订阅服务的类型
以下是两种类型的 Pub/Sub 服务:
- 发布/订阅服务
这是大多数用户和应用程序选择的主要消息服务。它提供:
高可靠:保证消息的一致性。
集成: 支持与其他服务的广泛集成。
自动容量管理:根据需求自动处理扩展。
数据复制:将所有数据同步复制到至少两个区域,并提供到第三个区域的尽力复制以提高可靠性。
- Pub/Sub Lite 服务
这是一项单独的消息传递服务,旨在更具成本效益,但需要进行一些权衡:
可靠性较低:与标准 Pub/Sub 服务相比,可靠性较低。
可用区或区域存储:可用区 Lite 主题存储在一个区域中,而区域 Lite 主题将数据异步复制到第二个区域。
需要预先配置:您需要管理和配置自己的存储和吞吐容量。
成本效益:如果必须保持低成本,并且您可以接受较低的可靠性和一些额外的管理任务,请考虑此选项。
3 Pub/Sub与其他消息传递技术进行比较
以下是 Pub/Sub 与其他消息传递技术的比较
- Pub/Sub 与消息队列
消息队列(例如 RabbitMQ):专注于一次向一个使用者发送消息,确保传输并通常保持顺序。最适合点对点通信。
Pub/Sub:同时向多个订阅者广播消息,非常适合许多服务需要对同一事件做出反应的事件驱动系统。
- Pub/Sub 与流媒体平台
流式处理平台(例如 Kafka):专为处理连续数据流而设计,可以将消息保留更长时间。更复杂,但非常适合分析。
Pub/Sub:更简单,无需大量设置即可实时传送消息。
- Pub/Sub 与 WebSockets
WebSockets:在客户端和服务器之间实现实时、双向的通信。最适合聊天等应用程序。
Pub/Sub:将发布者和订阅者分离,允许多个订阅者接收相同的消息,而无需直接连接。
- Pub/Sub 与 HTTP API
HTTP API:遵循客户端等待回复的同步请求-响应模型。适合直接交互。
Pub/Sub:允许异步通信,让发布者无需等待订阅者响应即可发送消息
- 点赞
- 收藏
- 关注作者
评论(0)