赞
踩
因为MQ可以异步处理,提高系统吞吐量。
应用解耦,系统之间可以通过消息通信,不关心其他系统的处理。
流量削峰,可以通过消息队列的长度,控制请求量。可以缓解短时间内的高并发请求。
解耦:A->BCD,但是如果E也想要这个数据,或者C不想要了。A就需要修改。与各种下游系统严重耦合。
如果使用MQ,A系统产生一条消息,到MQ,哪个系统要消息就去消息系统里去消费。
异步:A接收请求,在本地写库,在BCD三个系统分别要进行写库,本地很快,其它系统完成后传过来很慢,如果同步方式,
A需要BCD都完成之后,才能返回给前端,用户会觉得好慢。如果使用异步化处理的话,A本地写库完成,再往消息队列里写一个数据,就可以返回了。
削峰:大流量来的时候,系统可能承受不住这么大的压力,如果用MQ,就可以对这些请求不用急着处理,转化为MQ里的消息数据,然后以恒定的速率吐出。
系统可用性降低:MQ挂了,系统就挂了,增加环节就是在增加风险。
复杂性提高:要考虑的问题多了:比如一致性问题(A的消息给BCD用,BC成功,D失败,就是不一致了),如何保证消息不被重复消费,如何保证消息可靠性传输。
rocketMQ不够稳定,社区活跃度不高,rabbitMQ很稳定。
一个开源的,erlang编写的,基于AMQP协议的消息中间件
如何确认消息成功的发送到了rabbitMQ的Exchange?
可以使用事务机制,但是,性能太低了。
try{
channel.txSelect();
channel.basicPublish(xxx);
channel.txCommit();
}catch(Exception e){
e.printStackTrace();
channel.txRollBack();
}
生产者确认
生产者将channel设置为confirm模式,一旦信道进入comfirm模式,所有在该信道上的消息就会有一个从1开始的编号,deliveryTag,消息到达匹配的队列之后,rabbitMQ会发送Basic.ACK给生产者,包含那个编号,生产者就知道了。
事务机制是阻塞的,生产者确认机制是异步的。生产者收到ACK之后,可以在回调中处理,收到NACK也可以在另一个回调逻辑中处理。
为了确保RabbitMQ的高可用性,通常需要考虑以下几个方面:
集群部署(Clustering)
将多个RabbitMQ节点配置成集群,可以提供负载均衡和故障转移的能力。在集群模式下,消息队列可以分布在多个节点上,提高系统的吞吐量。如果一个节点失败,其他节点仍然可以继续工作。
镜像队列(Mirrored Queues)
在RabbitMQ集群中,可以设置镜像队列来确保队列中的消息被复制到多个节点。如果一个节点崩溃,队列的其他副本可以接管,保证消息不丢失。这是通过设置队列的x-ha-policy
参数来实现的。
持久化(Persistence)
对消息和队列进行持久化可以保护数据不会因为服务器崩溃而丢失。将消息标记为持久化(通过设置消息的delivery_mode
属性为2),并确保队列也被声明为持久化,可以提高数据的可靠性。
确认和事务机制(Acknowledgments and Transactions)
使用消息确认机制可以保证消息被正确处理。消费者处理完消息后发送ack(确认)给RabbitMQ,若RabbitMQ没有收到确认,它会将消息重新分发给其他消费者。此外,RabbitMQ还支持事务性消息处理。
监控和报警(Monitoring and Alerting)
监控RabbitMQ的运行状况并设置相应的警报机制,可以及时发现并解决潜在的问题。可以利用RabbitMQ提供的管理插件来监视队列的长度、消息吞吐量和节点状态。
硬件和基础设施的冗余
在硬件层面,确保服务器、存储和网络连接的冗余可以减少单点故障的风险。使用如RAID或SAN等存储方案可以提高存储系统的可靠性。
负载均衡(Load Balancing)
使用负载均衡器可以分散到集群的连接和流量。这不仅增加了系统的吞吐量,也避免了单个节点的过载。
备份和恢复(Backup and Recovery)
定期备份RabbitMQ的状态,包括消息队列的配置和消息数据。在发生灾难性故障时,可以用备份快速恢复服务。
升级和补丁管理
定期应用RabbitMQ和操作系统的更新和补丁,可以减少因为已知安全问题或软件缺陷导致的服务中断。
故障切换(Failover)策略
为系统设计故障切换策略,以便在节点或组件失败时能够快速恢复服务。
要实现这些策略,可能需要对RabbitMQ的高级特性有深入的了解,并且在系统设计和运维阶段做出相应的规划和实施。此外,持续的性能测试和优化也是确保RabbitMQ高可用的重要环节。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。