【编者按】服务编排是微服务设置的一个重要方面。本文在利用 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 官方博客

原文地址:https://dzone.com/articles/scalable-microservices-through-messaging

微服务扩展新途径:Messaging相关推荐

  1. 企业数字化转型必备利器之微服务扩展

    导读:本系列文章将通过介绍一个真实大型企业数字化转型过程中遇到的层层困难,以及微服务架构如何落地,涉及到的各种真实的解决方案.不空谈,不泛谈,讲事实是本系列文章的原则. 企业数字化转型是近些年来非常火 ...

  2. 基于微服务的新零售业务中台OMS

    一.项目简介 开源的一站式中台系统包括订单管理系统OMS/ERP.库存WMS统一管理系统和财务管理系统等,实现快速部署,并帮助企业后续自主进行开发迭代提供一系列的技术组件和业务组件支撑. 二.业务功能 ...

  3. Hystrix之外健壮微服务的新选择:Sentinel 发布首个生产版本

    Sentinel 阿里中间件团队开源的,面向分布式服务架构的轻量级流量控制框架,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性. 近日,阿里中间件开源组件S ...

  4. Hystrix之外健壮微服务的新选择:Sentinel 发布首个生产版本 1

    Sentinel 阿里中间件团队开源的,面向分布式服务架构的轻量级流量控制框架,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性. 近日,阿里中间件开源组件S ...

  5. 微服务扩展之AKF拆分原则

    X轴:通过克隆进行扩展--通过克隆或复制数据和服务,可以轻松地扩展事务.(水平复制) Y轴:通过拆分不同的东西进行扩展--用名词和动词标识数据和服务,从而进行划分.如果拆分正确,那么事务和数据集都能得 ...

  6. WebAssembly 开启微服务新时代

    整理 | 丁广辉       责编 | 张红月 出品 | CSDN(ID:CSDNnews) 如果从微服务的功能定义开始,很可能把这种模式定义为通过网络进行通信的REST服务.但当谈到编写微服务的程序 ...

  7. Serverless时代的微服务开发指南:华为云提出七大实践新标准

    摘要:本文结合华为云在Serverless Microservice方面的实践,总结提炼出七大Serverless Microservice开发 "实践标准",为加速全域Serve ...

  8. 基于 Docker 的微服务架构实践

    http://dockone.io/article/4887 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 DevOps,也见证了 Do ...

  9. 01 | 顶层设计:微服务生态与 Spring Cloud Alibaba

    通用的微服务架构应包含哪些组件 相对于单体式架构的简单粗暴,微服务架构将应用打散,形成多个微服务进行独立开发.测试.部署与运维.虽然从管理与逻辑上更符合业务需要,但微服务架构也带来了诸多急需解决的核心 ...

最新文章

  1. UVA10003 切木棍 Cutting Sticks(区间DP、细节)
  2. oracle11g怎么显示中文,ORACLE11G中PLSQL中文显示乱码、Linux下sqlplus查询中文乱码
  3. php 使用 go函数指针,golang 什么时候使用指针
  4. java ftp下载文件 慢_java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题...
  5. CSS基础(part18)--溢出的文字省略号显示
  6. 英特尔的务实创新之路:实在做技术,赋能开发者 | InfoQ推荐
  7. sql语句创建唯一索引
  8. Linux内核:kprobe机制-探测点
  9. 面向对象的原型与继承
  10. python3.5安装步骤-win7安装python3.5
  11. Android ListView观察者模式的应用
  12. 棋盘问题(深度搜索)
  13. usb摄像头做教学直播实现pc和手机都可以在线观看教程
  14. 我的世界服务器自动西瓜,我的世界自动化红石教程 全自动西瓜农场
  15. Android Back回退按钮
  16. 全球主要的域名争议解决机构有哪些?
  17. 2080 Calendar
  18. 常用的国际物流运输方式有哪些
  19. 用python做一个自动签到程序
  20. 熬夜帮学姐用Python完成词云图,没想到我好兄弟竟然...

热门文章

  1. [C语言]为什么要有include?——从Hello World说起
  2. 算法学习——决策单调性优化DP
  3. [HNOI2009]梦幻布丁
  4. 程序设计入门-C语言基础知识-翁恺-第六周:数组-详细笔记(六)
  5. django-restframework使用
  6. Flexbox 布局
  7. Python学习 - 常用模块(二)
  8. hdu5489 Removed Interval dp+线段树优化
  9. 十六进制,输出的时候怎样控制所输出字母的大小写。
  10. C# 委托:把方法组合到一个数组中使用