消息队列在使用中的注意事项

消息队列在使用中的注意事项

异步不是万能的,实现异步重要的手段,消息队列在使用中也是有不少注意事项的。 git

消息队列的瓶颈

消息队列至少有三处容易出现瓶颈,咱们一经典的发布/订阅模式为例。分析一下均可能存在哪些瓶颈。 github

发布 ---> 队列 ---> 订阅 json

  1. 入队瓶颈,发布消息队列,处理太慢,发布端堵塞应用程序。
  2. 队列持久化瓶颈,队列持久化是须要写入磁盘的,大量的密集IO操做
  3. 出队瓶颈,(茶壶煮饺子,有嘴倒不出)出队瓶颈还包括订阅端的处理能力,
  4. 若是订阅端的处理能力跟不上,也会出现瓶颈。
  5. 消息大小,每一个消息包的大小也决定了性能

发布端常见问题

发布端问题表如今入队速度影响了发布端应用程序的性能,例如 异步

runtime {
    task1();
    task2();
    publish();
    task3();
    task4();
}



loop {
    task1();
    task2();
    publish();
    task3();
    task4();
}

上面伪代码 publish()将阻塞 task3()与task4(),必须等待publish()执行完成才能继续运行。 oop

这样的状况是 发布数量 > 入队的速度, 影响发布端的性能 性能

队列持久化

消息的持久化,既影响入队速度,也影响出对速度,入队是写磁盘操做,出对是修改或者删除操做。 在队列同时进行入队与出队的操做是,还涉及到各类“锁”,例如线程锁与文件锁等等。 最终结果是消息队列性能骤降。 网站

订阅端性能

订阅端的处理能力也影响到队列的堆积程度。若是订阅端处理速度过慢,咱们就会发现消息在队列中堆积。 spa

loop {
    function sub_callback(){
        task1();
        task2();
        task3();
        task4();
    }
}

订阅端改进,将队列交给线程处理 线程

threads[max_connet] {
    function sub_callback(){
        task1();
        task2();
        task3();
        task4();
    }
}

消息的大小

咱们应该尽可能减少消息的体积,例如选择轻量的协议,超过必定体积作压缩处理。 code

就消息协议而言, 二进制协议 < 文本协议。而文本协议中 json < xml 等等。

xml 成对出现的闭合标签占用了大量的空间,二进制的 msgpack 也好于文本的 json。 选择使用那种协议还要看你的场景。

另外还须要注意的就是 序列化/反序列化的开销。

总结

咱们要尽可能作到发布,队列与订阅之间的平衡,才能发挥消息队列的优点。

做者

陈景峰,昵称 Netkiller, 英文名 Neo 《Netkiller 系列 手札》电子书的做者,读者QQ群:128659835,我的网站:http://netkiller.github.io/

转载请注明出处与做者声明

相关文章
相关标签/搜索