【编者按】服务编排是微服务设置的一个重要方面。本文在利用 ActiveMQ 虚拟话题来实现这一目标的同时,还会提供实用性指导。文章系国内 ITOM 管理平台OneAPM 编译呈现。
目前,微服务使用已十分普遍,利用服务编排(而不是服务编制)来进行微服务互动的想法也很常见。本文将讲述如何通过 ActiveMQ 虚拟话题来设置服务编排和基于服务互动的可扩展事件。
服务互动类型
服务互动类型主要有两种:同步和异步。
在同步互动中,服务使用者会发出请求,然后在操作完成、收取回复前阻止其他活动运行,HTTP 协议就是一个很好的同步互动例子。通常情况下,这种互动与请求-回复互动类型、 HTTP 协议都是相关的(当然,也可以利用异步请求或消息传递来登记、请求回调函数的结果,不过这种做法不太常见)。
在异步互动中,服务使用者发出的请求不用在操作完成后才可以运行。一旦请求确认被收到,服务使用者就可以接着做其他的活动。这种类型支持互动沟通采用发布-订阅模式,例如:不需要服务使用者调用其他服务操作,只需要生产者提出事件,等待感兴趣的使用者做出反应即可。
除了这些技术层面的考虑,还应该注意考量服务互动的其他层面:耦合和责任。
如果服务 A 要和服务 B 互动,是要服务 A 来调用服务 B(编制),还是让服务 B 去订阅正确的时间(编排)呢?
在服务编制中需要有一个中心实体(即例子中的服务 A),去了解被调用的其他服务。利用编排方法,可以将这个责任分配给个体服务,由它们来负责订阅“有意思的”事件。
如果想要了解更多关于本话题的内容,请查阅 Building Microservices。接下来,本文将集中讨论如何使用消息传递实现服务编排。
通过消息传递进行服务编制
服务编制是通过队列实现消息传递的。队列能够在竞争使用者模式下实现负载均衡,并且确保消息和使用者一一对应。
假设存在一个与“邮件服务”互动的“客服服务”,最简单的实现方法就是使用一个允许“客户服务”给“邮件队列”发送消息的队列。如果“客户服务”需要跟“忠诚值服务”互动,“客户服务”就要给“忠诚值服务”再发一条消息。这种办法下,“客户服务”需要了解“邮件服务”和“忠诚值服务”这两者,并且把正确的消息发给对应的队列。简而言之,整个互动过程都是由“客户服务”编制的。
使用队列的一个好处就是它可以轻松扩展使用者,并开启多个“忠诚值服务”和“邮件服务”,从而将负载均衡地分布于不同的使用者间。
通过消息传递进行服务编排
使用服务编排方式时,“客户服务”却不需要了解“忠诚值服务”和“邮件服务”。因为“客户服务”只要对“客户话题”发出一个事件,“忠诚值服务”和“邮件服务”就会去了解客户事件协议,并订阅正确的话题——话题的发布-订阅语意会确保每个事件同时被分发给两个订阅者。
扩展服务编排
话题执行发布-订阅,而不是竞争使用,这使得使用者的扩展变得更加困难。如果(横向)扩展“忠诚值服务”并在两个实例中进行试验,可以发现它们会收到同样的事件,这样扩展的话并没有什么益处(除非服务是等幂的)。
ActiveMQ 虚拟话题解决方案
因此需要一种融合了话题和队列的综合形式,充分发挥这两个功能:既能够利用“客户服务”的发布-订阅来发布事件,确保所有服务都能收到该事件;也可以通过竞争的使用者,使个体服务实例实现负载均衡并进行扩展。
实现该形式的方法有很多,可以利用 Camel 和 ActiveMQ :
-
第一个方法就是用一个简单的 Camel 路由来吸收“客户话题”事件,并把它们同时发送给“忠诚值队列”和“邮件队列”。这是很容易实现的,不过每当有新服务对“客户服务”事件感兴趣时都需要重新更新 Camel 路由。而且,如果在代理之外单独运行 Camel 路由,把消息从某一话题转入到其事先设定好的队列中去,就会带来不必要的网络开销。
-
上述方法的一个改进方案,就是在 ActiveMQ 代理流程中使用 ActiveMQ Camel plugin 来运行 Camel 路由。这样的话,虽然仍需要在订阅者发生变更时更新 Camel 路由,但是路由是在代理过程中发生的,因此不会产生网络开销。
-
不过还有更好的方案,就是将订阅该话题的队列 W/O 全部进行编码,但是要借用ActiveMQ 虚拟话题的声明法(这也是撰写本文的主要原因)。
ActiveMQ 虚拟话题是将订阅队列发布到话题中的方法,通过一个简单的命名惯例——所要做的就是确定话题或队列的命名惯例,无论是自定义的还是默认的都可以。
举个例子:
-
可以先创建一个与 VirtualTopic.> 表达式相匹配的话题名,如 VirtualTopic.CustomerTopic,
-
然后让“忠诚度服务”调用 Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic 队列,
-
那么消息代理就会将 VirtualTopic.CustomerTopic 话题中的所有事件都转发给
Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic 队列。 -
然后可以通过开启多个服务实例来扩展忠诚度服务,所有实例都从 Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic 队列中调用。
-
同样的,之后再用同样的命名惯例为邮件服务创建队列:Consumer.Email.VirtualTopic.CustomerTopic,这个功能允许用户以特定方式来简单命名话题和队列,并且无需编码就能订阅。
结论
以上所述只是最近出版的著作 Camel Design Patterns 里介绍的多种模式之一。正因为经常将Camel 与 ActiveMQ 一起使用,书中也就收录了一些 ActiveMQ 模式内容。
另外,用编排扩展微服务还可以通过事件驱动来实现,这里就是一篇介绍这种方法的推荐文章。
本文系 OneAPM 工程师编译整理。OneAPM 能为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客。
本文转自 OneAPM 官方博客
原文地址:https://dzone.com/articles/scalable-microservices-through-messaging
相关推荐
Learn how to use specific ØMQ programming techniques, build multithreaded applications, and create your own messaging architectures. You’ll discover how ØMQ works with several programming ...
Maven坐标:org.springframework:spring-messaging:4.3.12.RELEASE; 标签:springframework、spring、messaging、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,...
这本书详细介绍了如何利用ZeroMQ构建高效、可扩展和容错的系统。 ZeroMQ的核心理念是提供一个类套接字的接口,但其内在性能和特性远超标准网络套接字。通过使用ZeroMQ,开发者可以构建出复杂的消息传递模式,如发布...
Maven坐标:org.springframework:spring-messaging:5.0.8.RELEASE; 标签:springframework、spring、messaging、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可...
赠送jar包:spring-messaging-4.3.20.RELEASE.jar; 赠送原API文档:spring-messaging-4.3.20.RELEASE-javadoc.jar; 赠送源代码:spring-messaging-4.3.20.RELEASE-sources.jar; 包含翻译后的API文档:spring-...
《ZeroMQ:云时代极速消息通信库》设计了大量工作实例来实现请求- 应答模式的高级使用和容错性,并对发布- 订阅模式的性能、可靠性、状态分发与监控进行了扩展。 《ZeroMQ:云时代极速消息通信库》面向的读者是希望...
赠送jar包:spring-messaging-4.3.20.RELEASE.jar 赠送原API文档:spring-messaging-4.3.20.RELEASE-javadoc.jar 赠送源代码:spring-messaging-4.3.20.RELEASE-sources.jar 包含翻译后的API文档:spring-...
*提高可扩展性(Increase Scalability):Messaging机制可以实现多个消息接收器的并发处理,提高系统的可扩展性。 三、Messaging机制类型 Messaging机制可以分为四类: *云消息服务(Cloud Messaging Service):...
Avaya Modular Messaging(模块化语音消息处理)解决方案结合了Avaya世界一流的消息处理技术和行业标准,为客户提供了一种经济高效且灵活的途径,使其无论在当前还是未来,都能轻松实现消息处理系统投资最大化。...
3. **新功能**:可能引入了新的API或特性,以便开发者能更好地利用Flex Messaging构建复杂的应用。 4. **兼容性提升**:可能增强了与不同服务器平台、数据库系统或其他技术的兼容性。 5. **安全增强**:更新了安全...
- **中间件和设备(Intermediates and Devices)**:探讨了ZeroMQ中用于扩展网络拓扑的中间件和设备的概念。 - **发布-订阅代理服务器**:详细介绍了如何构建发布-订阅模式下的代理服务器,以支持更复杂的通信场景...
2. 可扩展性:它能够在不停机的情况下水平扩展,以适应不断增长的数据量和用户需求。 3. 容错性:通过复制和分区策略,Kafka能够在部分节点故障时保持整体服务的可用性。 4. 多种用途:它可以用于数据管道、流处理、...
Aggilus是真正的消息传递服务器,具有电子邮件,IRC,新闻组,即时消息传递等。 请勿申请加入,在论坛中进行讨论,您可能会被邀请。 编程必须在Visual Basic中完成,并且所有功能都必须在COM +中。
语言:English 改变跨平台,跨人的连接方式 PLATES是您需要的第一个消息模板服务,可将最佳的外联消息转换为可在Gmail和Outlook 365上使用的模板。借助Plates,您可以在三个主要的网络平台上提取该天才的冷电子邮件。...
LINE Messaging API SDK(Java版) 介绍 用于Java的LINE Messaging API SDK使使用LINE Messaging API开发机器人变得容易,而且您可以在几分钟内创建一个示例机器人。 文献资料 有关更多信息,请参见官方API文档。 ...
在CDE中,ToolTalk Messaging 是一个核心组件,它允许应用程序之间进行通信和数据交换,从而实现协同工作和信息共享。 ToolTalk是一种消息传递系统,它使得在CDE中的不同应用程序能够相互通信,就像它们都在同一...
Maven坐标:org.springframework:spring-messaging:4.3.12.RELEASE; 标签:springframework、spring、messaging、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可...
微服务架构是一种软件开发方法,旨在将大型的、复杂的应用程序分解为一组相互协作的小型服务,每个服务都专注于特定的业务功能,并且可以独立部署和扩展。这种架构模式允许团队更加灵活地处理应用程序的不同部分,...
11. **开发者扩展**:作为开放平台的一部分,Symbian Messaging允许开发者通过SDK进行扩展和定制,以满足特定用户或企业的个性化需求。 12. **性能优化**:考虑到Symbian系统的特点,Symbian Messaging在设计时注重...