消息系统中,经常使用的一致性解决方案以下:数据库
1) 发送消息给消息系统服务器
2) 消息系统入库消息多线程
3) 消息系统返回结果线程
4) 业务操做索引
5) 发送业务操做结果给消息系统队列
6) 更改存储中的消息状态内存
若是消息丢失,从业务数据补发消息是最完全的容灾手段。通常地,把集群和集群之间对消息的消费做为topic模型处理,而集群内部的各个应用实例对消息的消费当作Queue模型处理。引入clusterID来标识不一样的集群,集群内的各个应用实例的链接使用一样的ClusterID。分两级处理,从而达到多个不一样的集群进行消息订阅的目的。须要注意的是从topic中分发消息分发到不一样的queue中时,须要由独立的中转消息订阅者来完成,而且对同一个queue的中转只能由一个链接完成,为了实现高可用性,还须要备份节点。同步
为了保证消息发送的可靠性,首先要保证消息发送端的可靠性。保证消息存储的可靠性有多种方法:有基于文件的消息存储例如ActiveMQ,采用数据库的消息存储通常考虑采用宽表、冗余数据的方式实现,还有基于双机内存的消息存储。经过服务器主动调度安排投递的方式能够实现数据库存储的便利扩容。因为消息系统须要显示地收到接受者确认消息处理完毕的信号才能删除消息,因此保证消息投递的可靠性必定从应用层的响应入手。在进行投递时必定要采用多线程的方式处理,单机多订阅者共享链接,消息只发送一次,而后传到单机的多订阅者生成多个实例处理。消息重复接收主要是由于消息接受者成功处理消息后,消息系统不能及时更新投递状态形成的。应对消息重复的办法是使消息接收端的处理是一个幂等操做。消息队列
对应有序的消息队列而言,单机多队列的隔离完成了对消息的有序支持,进一步,把发送到这台机器的消息数据进行顺序写入,而后根据队列作一个索引,每一个队列的索引是独立的,其中保存的只是相对于存储数据的物理队列的索引。另外,采用消息同步复制的方式解决本地存储的可靠性。it