如果RabbitMQ集群只有一个broker节点,那么该节点的失效将导致整个服务临时性的不可用,并且可能会导致message的丢失(尤其是在非持久化message存储于非持久化queue中的时候)。可以将所有message都设置为持久化,并且使用持久化的queue,但是这样仍然无法避免由于缓存导致的问题:因为message在发送之后和被写入磁盘并执行fsync之间存在一个虽然短暂但是会产生问题的时间窗。通过publisher的confirm机制能够确保客户端知道哪些message已经存入磁盘,尽管如此,一般不希望遇到因单点故障导致服务不可用。
如果RabbitMQ集群是由多个broker节点构成的,那么从服务的整体可用性上来讲,该集群对于单点失效是有弹性的,但是同时也需要注意:尽管exchange和binding能够在单点失效问题上幸免于难,但是queue和其上持有的message却不行,这是因为queue及其内容仅仅存储于单个节点之上,所以一个节点的失效表现为其对应的queue不可用。
为了提高程序的吞吐量,保持消息的可靠性,一台机器挂了后,RabbitMQ能够正常生产,消费消息。
rabbitmq有三种模式:单机模式,普通集群模式,镜像集群模式
Demo级别的,一般只是本机测试玩玩而已,生产环境下不会用的。
在多台机器上启动多个rabbitmq实例,每个机器启动一个。
但是你创建的queue,只会放在一个rabbtimq实例上,但是每个实例都同步queue的元数据(存放含queue数据的真正实例位置)。消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从queue所在实例上拉取数据过来。
示意图
这种方式确实很麻烦,也不怎么好,没做到所谓的分布式,就是个普通集群。
普通集群的方式,确实达到了消息的高可用,但没办法保证可靠性,没做到分布式,简而言之,只是一个普通的集群。
这种模式,才是所谓的rabbitmq的高可用模式,跟普通集群模式不一样的是,你创建的queue,无论元数据还是queue里的消息都会存在于多个实例上,然后每次你写消息到queue的时候,都会自动把消息到多个实例的queue里进行消息同步。
上图中每个节点有一个queue,生产者生产完毕数据后投递到指定交换机的队列,交换机的队列进行消息同步。
每个节点queue都有一个完整的rabbitmq节点,所以这种方式叫做镜像集群
好处: 任何一个节点宕机后,其它节点不受影响,正常使用
坏处:
确保机器中安装了Docker,若未安装,可看:【云原生】Docker入门 – 阿里云服务器Linux环境下安装Docker
查看拉取的镜像
成功运行
设置节点1
浏览器输入 您的ip地址:15673
再次测试即可成功~
File —>New —>Project —>Maven —>直接Next 进入下一步创建普通的Maven工程即可
创建一个默认的Maven聚合工程,将src文件夹删除,该工程就是一个Maven聚合工程
引入依赖如下:
在项目内,新建一个Moudle,rabbitmq-order-producer 默认Maven工程,下一步即可
在项目内,新建一个Moudle,rabbitmq-order-cousumer 默认Maven工程,下一步即可
Maven聚合工程创建完成图
Maven依赖图
自行手写MainApplication即可
创建完成!
编写完成!
启动消费者
交换机
=
15674
15675
成功消费数据!
已成功同步消息~
阅读字数: 2513 | 5分钟阅读
获取嘉宾演讲视频及PPT ,请点击: http://t.cn/RDVY4JN
阿里巴巴中间技术专家不铭从功能特性、技术架构、最佳实践、案例分析四个方面进行了《Aliware-MQ消息队列》的分享。
Aliware-MQ是阿里云提供的企业级互联网架构的核心产品,基于高可用分布式集群技术,支持海量高并发和万亿级消息流转,支持海量的消息堆积,支持高可靠/高可用方案,提供了运维、监控等一系列完整的配套服务。
如上图所示,从消息的维度来看分为普通消息、顺序消息、定时消息和事务消息等四种消息,无论是发送哪种消息客户端都支持熔断机制,即如果发现发送目标节点有性能问题,客户端会自动进行熔断,把有问题的节点排出去,保证消息发往可靠性最高的机器。管理方面已经支持消息的查询、消息回溯、消息全链路轨迹和监控报警机制。性能上MQ已经达到了百亿级的堆积能力,毫秒级的投递延迟,支持万级节点高并发,集群水平热扩缩。消息消费方面,支持失败后的消息重投机制,失败的消息会重新投递到队列中去,现在最多支持16次重投。
上图是Aliware-MQ的功能架构。左边是控制台的管理,可以在上面做发布订阅管理。右边目前的接入方式是SDK支持TCP协议,同时也支持HTTP接口,以及面向手机终端的MQTT协议。
OpenAPI是MQ提供给用户的管控方式,用于实现一系列资源管理和运维功能,用户可以通过Open API查询所需要的任何东西。
上图中是我们今年推出的一个MQ移动物联网套件。之前的客户端,不管是上游还是下游收发都是用各自的服务器。但是今年我们有了移动物联网套件,可以直接面向终端设备。比如手机、汽车等移动设备利用移动物联网套件,通过一个网关就可以直接和消息系统打通。
Aliware-MQ的消息系统是基于队列。队列要保证数据安全,是支持高并发和高性能读写的最基本元素。
如上图所示,Producer是消息发送集群,下游的Consumer是消费者集群,都依赖于MQ的SDK。Broker是消息服务器,所有的消息都发送到Broker上面;Name Server和ZK功能类似,用来做服务发现。Producer要从Name Server获取到Topic在哪个节点上,订阅Topic时需要知道Topic从哪里取,同样需要Name Server。Broker上的Topic信息会定时在Name Server上注册,Producer和Consumer在交互之前会从Name Server上获取目标。
图中的master是主机,slave是备机,主备之间会做数据同步,有异步和同步两种方式。一个master可以布多个节点,这个根据自己的成本来决定。如果扩容的话,只要直接布一台master即可,它会定时地将Topic注册到Name Server上,发送方和订阅方也会定时地感知这个过程,整个扩容的过程对于用户来说大概30秒就能完成。
Aliware-MQ所有数据存储在Commit Log里,它在实现上就相当于一个文件夹,每次会生成一个1G的文件。不管哪个Topic写过来的消息都会直接写入这个文件中,这个文件写满后再直接写下一个。
针对每一个Topic,要在业务层面对它进行区分,所以我们做了一层索引。例如在上图中有5个队列,每个队列都会生成定长的索引文件,通过索引,可以找到这条消息当前处于哪个CommitLog文件的某个具体位置中。
这样存储结构,保证了无论多少个topic,CommitLog的写是顺序的,能较大的保证MQ的写入性能。
Aliware-MQ的负载均衡是按照队列维度来做的,消费的时候会把topic的队列平均分配给消费实例。比如有2个消费实例,topic队列是4个,那么每个消费实例就消费2个;而如果共有5个队列,那么就是是1个消费2个,另1个消费3个。一个队列同一时间只会被一个消费实例消费,所以当出现队列数量小于消费实例数量的情况时,就会有消费实例出现空闲,这个时候可以根据业务实际情况手动通过工具将队列数量调大。
消息写进来都是先放在Java堆里,然后再落盘。如果用户要消费的消息都在内存里,那么就可以很快的读取到。但是如果用户消息堆积比较久,消息已经不在内存里而是存储在了磁盘中,这个时候就需要去磁盘里取数据,然后加载到内存里面读取出来。
Aliware-MQ的刷盘策略有异步和同步两种。异步到内存就返回成功,同步写则一定是消息刷到磁盘中才会返回成功。这种刷盘方式可以根据业务的具体需求进行配置,从写入的性能来看,异步写的性能肯定是会比同步的好。
从发消息的角度来看,如果发送失败,会有补偿机制。MQ的客户端会做三次重发,一台机器发送失败之后会默认往另外两台机器再尝试,如果三次都失败了才会把最终的失败结果传回,这个时候用户需要自己对发送异常进行相关处理。
有幂等要求的业务,Consumer在使用的时候需要自己做去重操作,在一些场景下,如客户端本地等待超时等,是无法保证消息完全不重复的,因此用户在进行系统设计时需要考虑到这一点。
Aliware-MQ目前支持的消息最大是4M,消息越小,性能越高。定时消息是支持消息的定时投递,可以自行设置要投递的时间,最长是40天。事务消息通过两阶段的提交的方式,来解决分布式事务问题。顺序消息可以采用全局顺序、分区顺序,严格保证消息的顺序。
Aliware-MQ的使用场景主要有系统间异步解耦、分布式事务、异构数据复制与分发、双十一大促的削峰填谷、大规模机器的Cache同步、日志服务和IM实时通信以及实时计算分析。
MQ顺序消息分为全局有序和队列有序。全局有序是从指所有消息发出开始,下游的接收方都是按照顺序接收;队列有序则是将消息进行区块分区,同一个分区内的消息按照先入先出的顺序进行顺序消费,保证一个队列只会被一个进程消费。
当一个交易系统下单之后,会发一条消息到MQ,购物车接收消息把购物车里的状态清空。如果这时交易消息发送失败,购物车就无法清空,对于数据来说这就是一个脏数据。面对这种情况我们有事务消息可以解决这个问题,在交易开始时先发送一条半事务消息,然后交易系统开始下单,所有事情做完之后再提交半事务,这时只有主动提交成功,消息队列才会将这条消息实际发送给用户。如果交易下单过程失败,则可以主动回滚这条消息,购物车和交易系统之间可以做到没有脏数据。
双十一大促时,各个分会场会有玲琅满目的商品,每件商品的价格都会实时变化。使用缓存技术也无法满足对商品价格的访问需求,缓存服务器网卡跑满。访问较多次商品价格查询影响会场页面的打开速度。于是MQ提供了一种广播机制,本来一条消息只会被集群的一台机器消费。如果使用广播模式,那么这条消息会被集群下的所有节点消费一次,相当于把价格信息同步到需要的每台机器上,可以取代缓存的作用。
实时计算功能主要是做一个消息总线,业务系统自动采集数据,把消息分发达下游的实时计算系统里,根据实时计算结果来给业务方做服务。
我今天的分享就到这里,谢谢大家!
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)