1。简介消息中间件是指在分布式系统中完成消息发送和接收的基础软件。消息中间件也可以称为消息队列(MessageQueue/MQ)。在互联网场景中,消息中间件常用于进行消息路由、订阅发布、异步处理等操作,以缓解系统压力。引入消息队列主要是为了解决以下问题:解耦:比如订单系统,减少库存的工作可以通过消息队列交给库存系统处理,不需要等待实时响应.执行顺序:先进先出原则,业务事件按照进入消息队列的先后顺序进行处理。消息路由:将队列中的消息按照不同的规则发送给不同的业务服务。异步处理:将一些不需要实时响应结果的计算放到异步处理中,提高系统的吞吐量。削峰:减少高峰期的操作。比如整个操作流程包含12个步骤,最后11个步骤不关注结果的数据可以放在消息队列中。既然是为解决大流量场景而设计的,那么其自身的稳定性和健壮性就显得格外重要。我们来看看消息队列是如何保证可用性的。2.消息队列的基本组成在分析高可用特性之前,先回顾一下消息队列的基本组成。不管是什么类型的消息队列,基本上都包括以下组件:Broker:消息服务器,以服务的形式运行在服务器端,为各个业务系统提供核心的消息数据中转服务。Producer:消息生产者,业务的发起者,负责生产消息并传输给broker。Consumer:消息消费者,业务的处理者,负责从broker获取消息并进行业务逻辑处理Topic:主题模块,发布/订阅模式下消息的统一集合场所,不同的生产者向主题发送消息,以及MQ服务器将它们分发给不同的订阅者实现消息广播Queue:队列,在PTP模式下,特定的生产者向特定的队列发送消息,消费者订阅特定的队列完成指定消息的接收。消息:消息体是按照不同通信协议定义的固定格式编码的数据包,用于封装业务数据,实现消息传输。上图中以kafka为例。这是典型的集群模式。Kafka通过Zookeeper管理集群配置,选举领导者,并在ConsumerGroup发生变化时重新平衡。Producer采用push方式向broker发布消息,Consumer采用pull方式订阅并消费来自broker的消息。生产者负责生产消息。消费者负责消费消息。Broker是一个消息服务器,提供消息的核心处理工作。Zookeeper用于生产者和消费者的注册和发现。结构如何保证高可用。首先,高可用性是指系统出错的概率和无故障运行的时间。从消息队列的角度来看,至少要保证几点:消息丢失率低:消息可靠性也是衡量消息中间件好坏的关键因素,尤其是在金融支付领域,消息可靠性尤为重要.故障率低:消息中间件的可用性是指它运行无故障的时间百分比,通常用几个9来衡量,比如99.99%就是一个很好的指标。多副本容错:一般需要多副本,强一致性。多副本可以保证在master节点异常宕机后,slave可以提升为新的master继续提供服务,保证可用性。3.1RocketMQ以RocketMQ为例,其集群模式为:多主模式多主多从异步复制模式-多主多从同步双写模式。NameService集群:RocketMQ的“中枢大脑”,RocketMQ的服务注册中心,集群模式保证其可用性。ProducerClusterConsumerCluster:避免单实例消费者服务失败导致的消息堆积。多主多从模式部署架构图:Producer与NameServer集群中的其中一个节点建立长连接(随机或RR选择),周期性从NameServer获取Topic路由信息,可以订阅来自BrokerMaster或Broker的消息BrokerSlave信息。3.2KafkaKafka集群由以下组件组成:若干个消息生产者Producers(可以是业务web程序,定时任务服务,对其他下游服务的请求等)一个broker组(Kafka支持水平扩展,一般来说,多brokers,集群吞吐率越高)一个消费组ConsumerGroup,在资源充足的情况下,消费者越多,消费效率越高,性能越好一个Zookeeper集群:保证消费者和生产者的注册和订阅,避免业务之间的耦合,提高可用性。两个关键点:Kafka通过Zookeeper管理集群配置,选举leader,ConsumerGroup变化时re??balance。Producer采用push方式向broker发布消息,Consumer采用pull方式订阅并消费来自broker的消息。
