微服务扩展新途径:Messaging

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

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

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

相关文章

C语言发送邮件

c语言发送邮件Linux下使用c语言发送邮件 领导交代一个任务,需要将服务器上的df -hl的执行结果定时发给他。 尝试使用sendmail来发邮件,但是后来放弃了,并不是所有的服务器上都安装了sendmail。 于是,就用c写一个吧,还…

linux虚拟主机泛解析,Apache虚拟主机的配置和泛域名解析实现代码

Apache虚拟主机的配置和泛域名解析实现代码更新时间:2012年03月11日 00:28:19 作者:Apache虚拟主机的配置和泛域名解析实现代码,需要的朋友可以参考下虚拟主机的配置基于IP地址的虚拟主机配置Listen 80DocumentRoot /www/jb51ServerName ww…

GetBuffer与ReleaseBuffer的用法

GetBuffer与ReleaseBuffer的用法,CString剖析2008-06-07 22:39 这是一个非常容易被用错的函数,主要可能是由于大家对它的功能不太了解。其实点破的话,也不是那么深奥。 GetBuffer(int size)是用来返回一个你所指定大小可写内存的成员方法。它…

Linux 路径和目录问题

相对路径和绝对路径 绝对路径: 一定要从跟目录写起,比如/usr/share.doc 相对路径,不是由/写起的,相对指的是相对于目前的工作目录的路径。比如cd ../man,..指的是上一级目录 目录的相关操作: . 此层目录 ..…

关于js中function(e) e的理解

e是事件,在firefox中只能在事件现场使用window.event,所以只有把event传给函数使用。 为了兼容FF和其它浏览器,一般会在函数里重新给e赋值:e window.event || e;也就是说,如果window.event存在,则该浏览器…

socket用法linux,linux socket编程,要用到哪些函数,和用法介绍?_Linux_天涯问答_天涯社区...

4、获得地址信息/* 来源: http://www.jfox.info/c/a/ic/18071a.html */#include #include /* for strncpy */#include #include #include #include #include intmain(){int fd;struct ifreq ifr;fd socket(AF_INET, SOCK_DGRAM, 0);/* I want to get an IPv4 IP address */if…

深入浅出 RPC - 浅出篇+深入篇

摘自: http://blog.csdn.net/mindfloating/article/details/39473807 近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 RPC 在其中扮演着关键的作用。在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行…

[iPhone开发]UIWebview 嵌入 UITableview

UIWebview 嵌入UITableview, 将UIWebview 加入到UITableview的cell里面,而且,将UIWebview 的高度设为内容的高度,内容的高度,可以当UIWebview 载入完成之后,从UIWebview 的子view中找到scrollView,这个scro…

把A表中的a字段和b字段数据 复制到B表中的aa字段和bb字段

insert into tab2 (column1,column2) select column1,column2 from tab1 转载于:https://www.cnblogs.com/jthb/p/3423175.html

linux如何备份网站,linux怎么备份网站

云服务器备份 CSBS云服务器备份(Cloud Server Backup Service)为云服务器下所有云硬盘创建一致性在线备份,无需关机。针对病毒入侵、人为误删除、软硬件故障等场景,可将数据恢复到任意备份点¥0.268¥0.2/GB/月通过自定义脚本实现SA…

Docker热点文章链接 - 持续更新

docker技术的不断更新让我只能不停奔跑:Docker官方网站Chris Richardson 微服务系列DaoCloud博客 2016/6/23 (周四) 12:48 DockerCon 2016 D1|自身集成编排,Docker 意欲清场?DockerCon 2016 D2|剑指商业化Docker 1.11&…

图灵访谈系列之一:陈世欣谈产品经理与社区

原文链接地址:点击打开链接 10月20日,产品经理社区PMCamp、极客社区TopGeek的发起者和组织者陈世欣先生来图灵做客,畅谈对产品经理成长和社区发展的看法。以下为图灵社区整理的相关谈话内容。 人物简介: 陈世欣 StingChen产品经理…

C#中Hashtable的用法

在封装题库的时候,发现传实体很受限制,每个题型都需要建立不同的实体,这 样封装的时候就需要将实体一起封装,而且添加新题型的也不够灵活,这样就想到了 HashTable,让所有的题型都使用HashTable来传参&#…

kdbg调试linux汇编,Ubuntu 16.04安装Kdbg替代Insight实现汇编的调试

ibatis XML标签的含义selectKey: 有3个主要的属性: 1)resultClass:返回的主键的数据类型,跟sqlMap中的数据类型一致: 2)type:表示主键在insert之前或之后生成(取决于 ...raspberry 烧写镜像到SD卡刚开始接触树莓派,需要烧写系统镜像到SD卡,网上找了些资料,记录于此. ra…

Jenkins 使用 maven 出现C:\Windows\system32\config\systemprofile的解决

jenkins 使用 maven 出现 C:\Windows\system32\config\systemprofile 的原因是 Jenkins 服务启动的账号使用了系统的账号,在服务里改成具体的桌面用户账号即可。 If your command runs fine on Win command prompt as user X, then you should run Jenkins with the…

mediawiki禁止注册

只允许管理员代为注册,在LocalSettings.php中增加: $wgGroupPermissions array(); $wgGroupPermissions[’*’ ][’createaccount’] false; $wgGroupPermissions[’*’ ][’read’] true; $wgGroupPermissions[’*’ ][’edit’] false; $wgGroupPermissions[’…

在Linux下用源码编译安装apache2

Linux下安装一个软件,最好去看下它的官方guide,apache2.4的安装安装guide 0. installation guide http://httpd.apache.org/docs/2.4/install.html 然后是下载源码 1. download http2.4, 下载地址 下载好了以后,把它解压到一个路…

c语言第十五周答案,C语言考前练习试题及答案

C语言考前练习试题及答案天行健,君子以自強不息,地勢坤,君子以厚德载物。以下是小编为大家搜索整理的C语言考前练习试题及答案,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网!一、选择题(每小题1分&#xff0…

表格存储技术方案实践及客户案例分享

表格存储是一款2014年10月份正式商业化的NoSQL数据存储服务,在商业化之前,早在2010年就在阿里云内部开始使用,云邮箱和云OS都是表格存储最早的一批用户。到目前,无论是在阿里集团内部还是在公共云环境上,在移动社交、金…

delphi 打开资源管理器并定位到指定目录下的文件

可以与 Explorer.exe 一起使用的命令行选项有:/n、/e、/root(加上一个对象)和 /select(加上一个对象)。 usesShellAPI;ShellExecute(Handle,nil,Explorer.exe,PChar(Format(/e,/select,%s, [GLogger.CurrFileName])),n…