指令池的搭建与使用
指令池是服务于任务变更的(如取消任务、暂停任务、执行指令等),后端应用程序可以通过指令池把任务变更指令通知到执行该任务的云计算服务软件。
对应的,每个云计算服务软件运行之初都需要在RabbitMQ中创建一个专属的指令消息队列。
云计算服务软件开始执行任务时,需要把专属的指令消息队列名称与任务ID发送给后端应用程序(通过RESTful API),后端应用程序需要记录其对应关系。
后端应用程序发送任务变更指令时,通过默认交换机和指定的指令消息队列名称,把变更指令发送到正在执行该任务的云计算服务软件中。
后端应用程序发送任务变更指令和云计算服务软件领取任务变更指令的流程如图5.26所示。其中,后端应用程序不会同步得知变更指令的执行结果,该执行结果可以体现在任务进度或中间结果当中。
图5.26 后端应用程序发送任务变更指令和云计算服务软件领取任务变更指令的流程
如果需要发送任务变更指令(取消任务等)时,该任务还没被执行(任务停留在任务池中),那么后端应用程序需要先把任务变更指令记录在数据库。
当任务开始被执行后,云计算服务软件会通过RESTful API通知后端应用程序,此时后端应用程序才把任务变更指令发送到指定指令消息队列中。
在一些特殊的运维场景中(如一键暂停或取消所有任务),后端应用程序需要广播共通的变更指令。对应的,可以创建一个广播模式的交换机,且每个后端应用程序都把专属的指令消息队列绑定到该交换机上。这样的话,后端应用程序就可以通过广播模式的交换机一次性地把变更指令发布到所有的指令消息队列中。
除了以上介绍的“任务变更指令发送与领取流程”“任务未开始时需要把任务变更指令滞后发送”“为特殊运维场景增加广播模式的交换机”以外,一般来说,指令消息队列还需要关注以下两个细节:
·指令消息队列可设置为断开连接即自动删除,因为每次云计算服务软件启动时都会创建一个新的专属指令消息队列。
指令消息队列搭建与使用的相关代码如代码5.17所示,其中,示例代码是使用C++编写的,而后端应用程序一般是使用Java等开发语言编写的,所以在实际编码中,后端应用程序发送任务消息部分的编码可能会有所区别。
代码5.17 指令消息队列搭建与使用的相关代码
指令消息一般为JSON格式,这样能做到灵活配置。后端应用程序在发送任务时,需要把指令消息转换成字符串。而云计算服务在获取到指令消息后,需要把字符串转成JSON格式。指令消息一般包含指令标识、任务ID、指令参数,如代码5.18所示,其中,如果变更指令的执行结果需要通知后端应用程序,则可以在指令消息中加入回调后端应用程序的RESTful API地址等。另外,为防止一些问题,云计算服务软件在执行指令前,需要先判断任务ID,如果任务ID非当前执行的任务对应的ID,则丢弃此指令消息。
代码5.18 指令消息示例
本文给大家讲解的内容是云计算服务架构指令池的搭建和使用
下篇文章给大家讲解的内容是大型网站架构的技术细节:进度数据池与状态数据池的搭建和使用,公共数据空间
感谢大家的支持
领取专属 10元无门槛券
私享最新 技术干货