友情提示:全文约2600字,预计阅读时间12分钟
摘要
消息队列作为重要的中间件,广泛用于分布式系统中各子系统间的异步解耦;本文主要介绍了大云消息队列中间件BC-MQ在BC-DeepWatch中的应用案例。
一、消息队列应用场景简介
消息队列是分布式系统中非常重要的一个组件,我们可以把它看成是一个用于保存消息的容器,发送方将消息发送至消息队列,消费方按需消费消息。
图1-1 消息模型示意图
其主要的应用场景包括:
系统解耦
业务流程的高耦合易产生子系统故障影响整个系统的问题,通过引入消息队列作为消息的中转,实现对业务系统的拆分,提升系统可用性及可扩展能力;
异步通信
多个子系统间同步处理易导致用户请求响应慢的问题,引入消息队列作为子系统间异步通信的工具,可实现削峰填谷,抗住流量的高峰值;
数据同步
消息队列可用于各个子系统间数据的同步,如子系统A作为生产者,将数据发送至消息队列,子系统B作为消费者,通过消费消息完成A到B的数据同步;
广播
对于某些消息的一对多通知场景下,可通过引入消息队列,上游将每次需要广播的消息发送至消息队列,下游子系统通过订阅的方式接收消息,上游不再关心具体是谁订阅,将会极大地减少开发和联调的工作量;
设备接入
针对物联网等场景下多设备接入的问题,可引入轻量级的MQTT消息队列实现海量设备的接入、连接管理和数据发布订阅;并且可选多种传输质量规格,解决了以下痛点场景:
· 设备连接数较大,服务端需要从海量客户端(设备)中采集数据,或者下发指令到众多设备;
· 客户端CPU、内存比较小或带宽较窄等;
· 要求消息能主动推送至客户端,实时性较好。
为了帮助大家更好地理解消息队列中间件在实际业务系统中的应用,以下将对BC-MQ在BC-DeepWatch中应用案例进行介绍。
二、BC-MQ在BC-DeepWatch大云运维管理平台中的应用
1、BC-DeepWatch简介
BC-DeepWatch是一款监控、性能、日志管理、资源管理、自动化运维、统一纳管为核心的多维度统一运维管理平台。涉足于多个领域,为政务云、金融云、公有云、混合云等不同形态的云服务提供规模化、定制化的运维解决方案,满足行业内多种云服务的运维场景需求,作为运维管理平台,为管理者随时掌控系统运行的全方位信息提供了有力支持。
2、BC-MQ在BC-DeepWatch中的应用
1.系统解耦
系统中各模块间没有直接的调用关系,那么新接入的模块对原本系统的影响将会较小;以大云运维管理平台(BC-DeepWatch)为例,由于承接了众多上云产品的监控告警、日志对接工作,因此平台面临着大量新增模块的问题。
图2-1 云监控产品对接示意图
若各产品和平台间采用上图中直接调用的方法,那么每当有新增产品,就需要修改对应的调用接口,带来重复工作量;同时新模块的引入通常会降低系统的可用性。
在BC-DeepWatch中引入消息队列BC-MQ,接入云监控的各产品按照一定的上报格式将产品的配置数据、性能数据和告警数据推送至消息队列中,BC-DeepWatch再从消息队列中消费具体数据,进行下一步的处理。由于消息队列集群本身可以承接海量消息的积压,所以平台可以按照一定的采集频率从消息队列中消费数据,而与下游各产品无关,从而实现了平台与各产品间的解耦,同时也可以避免下游子系统故障对核心业务系统的影响,提升了代码可维护性和扩展性。
图2-2 BC-MQ在系统解耦中的应用
由以上的例子我们可以看到,引入消息队列具有如下优势:
· 平台可异步处理下游云服务上报的数据;
· 各个上云产品只负责将上报的数据写入消息队列,无需关心运维平台如何获取及使用性能数据;
· 有新的上云产品接入监控服务时,与现有产品无关;即使某一产品出现问题或请求超时,也不会影响到整个系统;
· 高并发时运维平台可根据自己能够处理的请求数从消息队列中拿取数据,利用消息队列消息堆积能力,起到削峰填谷、及时限流的作用;
2.数据同步
运维平台中另一个应用到BC-MQ的场景为两个CMDB集群之间数据的同步,一个集群作为消息的生产者,将待同步的数据发送至BC-MQ,另一个CMDB集群作为消费者,从队列中消费数据并写入集群中,从而实现数据的同步。
图2-3 BC-MQ在数据同步中的应用
三、引入消息队列可能带来的问题及BC-MQ的应对
以上我们通过两个例子展示了消息队列中间件的引入带来了一系列优势,那么有的同学不禁要问,引入一个组件会带来哪些风险和问题呢?以下我们将对消息队列的弊端和BC-MQ的应对进行说明:
1.系统的可用性降低
新组件的引入必然会带来系统可用性的影响,为了避免消息队列服务异常对整个系统带来影响,BC-MQ集群采用了Master-Slave的部署方式及Dledger(多副本模式),保障整个集群的各个组件无单点故障,以确保整个服务的可用性。
2.数据一致性问题
引入消息队列后,本身由A到B的业务流程中间增加了消息队列,如何保障分布式子系统间的一致性便成了问题。对此,BC-MQ支持事务消息类型,对于强一致性需求的业务系统,可通过事务消息保障。
3.系统复杂性提升
有的同学可能会担心消息队列的引入可能会带来重复消费、消息顺序性等问题,针对重复消费,BC-MQ在消息消费完毕后,会返回一个CONSUME_SUCCESS的确认消息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;针对消息顺序性,可通过BC-MQ中顺序消息类型保障。
四、总结
消息队列BC-MQ是云管中台-中间件组自研的一款基于分布式集群技术的中间件产品,具有安全可靠、简单易用、高可用、低延迟等特点,可用于大型分布式系统各子系统间的消息存储于收发;目前提供RocketMQ和MQTT消息队列两款产品优势总结如下:
消息队列RocketMQ
在开源RocketMQ基础上进行优化,目前提供普通消息、事务消息、顺序消息等多种类型的消息服务,可解决异步通知、削峰填谷等场景下的特性需求。
高性能:支持亿级消息堆积;单节点吞吐量10Wtps+,满足用户消息收发的业务需求;
高可用:集群采用Master-Slave的部署方式,避免单点故障,保障服务的高可用;
简单易用:支持Java版本的SDK,通过修改少量代码即可接入服务;
消息查询/轨迹查询:可通过控制台查询消息/消息轨迹,方便用户快速定位问题;
死信队列:支持消息重试机制,当达到最大重试后消息进入死信队列;提供死信队列的查询、导出、重新发送等功能;
消息队列MQTT
针对移动互联网、物联网等场景设计的轻量级消息中间件产品;基于Pub/Sub(发布/订阅)消息模型,支持一对多的消息收发方式;可连接各类物联网设备,传输消耗低;
高性能:集群可支撑百万级设备的在线连接,百万级消息并发;可实现毫秒级消息推送;
功能全面:支持离线消息/遗言消息/保留消息类型,持久化/非持久化连接方式,QoS=0/1/2不同级别的传输质量;
安全可靠:通过对连接设备及消息发布订阅进行鉴权,保障用户数据安全;
消息队列是分布式系统中不可或缺的中间件产品,除了对现有的RocketMQ和MQTT消息队列的持续优化,团队也将在今年提供AMQP协议支持,采用计算、存储分离架构,兼容RabbitMQ客户端的同时解决开源RabbitMQ在吞吐性能、可用性方面的痛点,希望大家持续关注;最后也欢迎大家多多试用BC-MQ~
- END -
往期精彩
1.【干货分享】如何量化用户体验?公有云产品用户体验度量体系搭建浅谈
2.【干货分享】UEFI启动流程介绍