消息队列

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的回查接口

 

   

posted @ 2016-05-25 22:52  YDDMAX  阅读(413)  评论(0编辑  收藏  举报