消息队列
1、阿里的消息队列有MQ和Notify
消息队列的作用是解耦,并发,异步
2、MQ不保证重复性,保证局部有序
Notify不保证重复性,不保证有序性
3、重复性
因为多个线程或者进程或者多个机器之间进行通讯可能会出现问题,比如:网络超时而造成流程不能正常进行下去。所以比较好的处理机制是重试。
在多机或者多线程的环境中,因为网络原因或者其他原因,经常会出现类似超时或者其他原因造成拿不到确切的回执结果,此时要么等待,要么重试,要么默认成功或者失败。
4、幂等性
因为网络(网络包重复)或者其他原因,消息可能会出现重复投递,此时需要解决重复性的问题,下面是两种解决思路
1、使用去重表
每次收到请求,检查该请求是否已经成功处理过。如使用msgId去重
2、业务规则实现幂等
1、状态机
2、消息标识状态从哪变到哪
3、状态机,和2比较相似
5、有序性
有序性则限制了整个集群的吞吐量,因为队列的消息时锁住的保证消息一个接一个消费
6、如何解决有序性:
业务规则实现等幂
假如有几个消息,每个消息标识的业务字段分别为1,2,3,4,状态机为:1->2->3->4
系统现在的默认状态为0,先收到3消息,业务系统直接置现在的状态为3,然后收到1消息,根据状态机丢弃该消息,类似的2消息也会丢弃。(此方法也能解决消息重复实现幂等)
7、消息堆积问题
现在MQ采取MappedByteBuffer也就是内存映射文件来解决该问题。
磁盘的吞吐量一般为150M,随机读的时候因为不断的需要磁盘寻道吞吐量下降到50M。随机寻道是磁盘性能的主要原因。
因为消息写是不断的附件文件,读一般也是顺序的读文件,所以读写磁盘的时候随机读和写会比较少,所以花在磁盘寻道上的时间也会比较少,这样磁盘的性能就上去了。
8、事务消息
需要实现消息队列 server的回查接口