消息系统只能根据主题提供正确队列中的
Posted: Sun Jan 26, 2025 6:43 am
如果发布者想要发布消息,他或她必须为其添加主题。消息。订阅者必须在消息系统中注册主题才能接收在那里发布的消息。仅当所有注册订阅者都收到主题中发布的每条消息时,该消息才被视为已发送和删除。
如果收到消息时没有订阅者注册,则该消息将被视为立即送达并将被删除。但是,行为可能会因实现而异。例如,有些消息系统会为失去连接的注册订户缓存消息。一旦订阅者再次在线,等待的消息就会被传送。
发布订阅模式是一种一对多或多对多消息传递系统,可确保所有消息按照接收消息的时间顺序进行传递。当消息需要转发给多个订阅者时,它通常用于广播。在这种情况下,每个参与者都会出于自己的目的处理消息。如果一条消息只能处理一次,那么发布订阅就是错误的选择。
股票经纪人经常被引用作为使用的例子。在这里,您可以创建一系列发 美国消费者电子邮件列表 布者,用于监控各种股票价格并发布主题中的每个变化。然后,许多订阅者可以注册该主题,并计算价格预测、将价格保留在数据库中或以图形方式准备它们。
该系统的核心组件是 Exchange,它是出版商的唯一联系人。发布者不会将其消息直接发送到队列,而是发送到交换器。交换器管理所有队列并了解它们的主题。一旦他收到消息,他就会将其分类到正确的队列中。
消息队列的优点
当应用程序临时生成的消息多于接收应用程序可以处理的消息时,消息队列非常有用。这样生产者就不会被过载的消费者阻塞。消息只是存储在队列中,直到消费者有空为止。
通过使用消息队列,消费者可以在一定程度上放心,因为他不再接收来自生产者的推送消息。相反,消费者可以在准备好时简单地获取下一条消息。
解耦
消息队列的使用使应用程序彼此解耦。生产者和消费者应用程序不再需要彼此了解,而只需与消息队列进行交互。解耦允许不同团队在单独的项目中开发这两个应用程序。
可扩展性
如有必要,所有三个组件(生产者、队列、消费者)都可以独立扩展。例如,一旦消息在队列中累积,就可以启动其他消费者进程。
可维护性
开发多个小型应用程序而不是一个大型整体应用程序也可以提高可维护性。经验表明,较小的项目更容易维护。
异步通信
应用程序异步通信。这可以防止生产者被消费者阻止。缓存允许消费者在发送消息时甚至处于离线状态。
应用领域
解耦微服务
下图显示了在发布订阅模式中,多个微服务如何通过消息代理进行通信。每个微服务都使用一个特定的主题,该主题在此处以颜色显示。每个微服务还将其自己主题下的消息发送到交换器,交换器将它们放入相应主题的队列中,从而将它们转发到其他微服务
暂时可用的设备
当微服务暂时离线时,其任务会被收集到队列中,并可以稍后执行。例如,当服务在移动设备上运行、在互联网连接较差的偏远地区运行时,或者只是在数据中心重新启动 Docker 容器时,就会发生这种情况。
这显示了相对于传统 Web 服务环境的优势。如果服务直接相互调用,则对当前不可用的服务的每个请求都会以错误结束。每个单独的服务都必须负责缓存和重新启动。
然而,在 AMQP 环境中,任何服务都可以随时处理任何其他服务。如果服务未连接到其队列,则消息会等待,直到它重新联机。然后处理所有待处理的任务。除了延迟之外,故障甚至可能被忽视。
风险和副作用
如果微服务在重启后在任何情况下都不允许处理过时的消息,请务必小心。风电场中的涡轮机每分钟报告其状态就是一个例子。维护人员现在注意到涡轮机在一个小时内一直报告相同的风速。这不可能吧,系统有问题。
如果收到消息时没有订阅者注册,则该消息将被视为立即送达并将被删除。但是,行为可能会因实现而异。例如,有些消息系统会为失去连接的注册订户缓存消息。一旦订阅者再次在线,等待的消息就会被传送。
发布订阅模式是一种一对多或多对多消息传递系统,可确保所有消息按照接收消息的时间顺序进行传递。当消息需要转发给多个订阅者时,它通常用于广播。在这种情况下,每个参与者都会出于自己的目的处理消息。如果一条消息只能处理一次,那么发布订阅就是错误的选择。
股票经纪人经常被引用作为使用的例子。在这里,您可以创建一系列发 美国消费者电子邮件列表 布者,用于监控各种股票价格并发布主题中的每个变化。然后,许多订阅者可以注册该主题,并计算价格预测、将价格保留在数据库中或以图形方式准备它们。
该系统的核心组件是 Exchange,它是出版商的唯一联系人。发布者不会将其消息直接发送到队列,而是发送到交换器。交换器管理所有队列并了解它们的主题。一旦他收到消息,他就会将其分类到正确的队列中。
消息队列的优点
当应用程序临时生成的消息多于接收应用程序可以处理的消息时,消息队列非常有用。这样生产者就不会被过载的消费者阻塞。消息只是存储在队列中,直到消费者有空为止。
通过使用消息队列,消费者可以在一定程度上放心,因为他不再接收来自生产者的推送消息。相反,消费者可以在准备好时简单地获取下一条消息。
解耦
消息队列的使用使应用程序彼此解耦。生产者和消费者应用程序不再需要彼此了解,而只需与消息队列进行交互。解耦允许不同团队在单独的项目中开发这两个应用程序。
可扩展性
如有必要,所有三个组件(生产者、队列、消费者)都可以独立扩展。例如,一旦消息在队列中累积,就可以启动其他消费者进程。
可维护性
开发多个小型应用程序而不是一个大型整体应用程序也可以提高可维护性。经验表明,较小的项目更容易维护。
异步通信
应用程序异步通信。这可以防止生产者被消费者阻止。缓存允许消费者在发送消息时甚至处于离线状态。
应用领域
解耦微服务
下图显示了在发布订阅模式中,多个微服务如何通过消息代理进行通信。每个微服务都使用一个特定的主题,该主题在此处以颜色显示。每个微服务还将其自己主题下的消息发送到交换器,交换器将它们放入相应主题的队列中,从而将它们转发到其他微服务
暂时可用的设备
当微服务暂时离线时,其任务会被收集到队列中,并可以稍后执行。例如,当服务在移动设备上运行、在互联网连接较差的偏远地区运行时,或者只是在数据中心重新启动 Docker 容器时,就会发生这种情况。
这显示了相对于传统 Web 服务环境的优势。如果服务直接相互调用,则对当前不可用的服务的每个请求都会以错误结束。每个单独的服务都必须负责缓存和重新启动。
然而,在 AMQP 环境中,任何服务都可以随时处理任何其他服务。如果服务未连接到其队列,则消息会等待,直到它重新联机。然后处理所有待处理的任务。除了延迟之外,故障甚至可能被忽视。
风险和副作用
如果微服务在重启后在任何情况下都不允许处理过时的消息,请务必小心。风电场中的涡轮机每分钟报告其状态就是一个例子。维护人员现在注意到涡轮机在一个小时内一直报告相同的风速。这不可能吧,系统有问题。