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

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

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

消息队列的瓶颈

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

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

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

发布端常见问题

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

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



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

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

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

队列持久化

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

订阅端性能

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

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

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

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

总结

我们要尽量做到发布,队列与订阅之间的平衡,才能发挥消息队列的优势。

原文发布于微信公众号 - Netkiller(netkiller-ebook)

原文发表时间:2016-10-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算

重新审视分布式(微服务)体系结构中的全局数据一致性

早在2015年的时候,我写了几篇文章,介绍如何通过搭载标准Java EE事务管理器以获得跨分布式服务的数据一致性(查看原文请点击这里,基于Spri...

1312
来自专栏架构说

线程池的作用

问题: nginx 写的线程池太过抽象根本理解不了 例如 pthread_create()函数创建了线程 线程就开始提供服务了(还需要提供别人使用),回收更解...

34613
来自专栏架构师之路

数据库秒级平滑扩容架构方案

一、缘起 (1)并发量大,流量大的互联网架构,一般来说,数据库上层都有一个服务层,服务层记录了“业务库名”与“数据库实例”的映射关系,通过数据库连接池向数据库路...

4038
来自专栏程序员互动联盟

【线程池】线程池与工作队列

为什么要用线程池? 诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式...

3278
来自专栏决胜机器学习

《Redis设计与实现》读书笔记(二十七) ——Redis哨兵(sentinel)主服务器下线判断与故障转移

《Redis设计与实现》读书笔记(二十七) ——Redis哨兵(sentinel)主服务器下线判断与故障转移 (原创内容,转载请注明来源,谢谢) 一、主观下线检...

2964
来自专栏张善友的专栏

替换EnterPrise Library 4.0 缓存应用程序块的CacheManager

缓存是用来提高应用程序性能的常见技术,其实现方式是将常用数据从慢数据源复制到更快的数据源。对于数据驱动的应用程序来说,该技术通常需要将从数据库或 Web 服务检...

1727
来自专栏用户2442861的专栏

存储过程的优缺点

http://blog.csdn.net/jackmacro/article/details/5688687

632
来自专栏ASP.NETCore

讨论.NET Core 配置对GC 工作模式与内存的影响

https://mp.weixin.qq.com/s/PqhUzvFpzopU7rVRgdy7eg

433
来自专栏Java架构沉思录

优雅实现延时任务之Redis篇

延时任务,顾名思义,就是延迟一段时间后才执行的任务。举个例子,假设我们有个发布资讯的功能,运营需要在每天早上7点准时发布资讯,但是早上7点大家都还没上班,这个时...

483
来自专栏Golang语言社区

Golang协程与通道整理

协程goroutine 不由OS调度,而是用户层自行释放CPU,从而在执行体之间切换。Go在底层进行协助实现 涉及系统调用的地方由Go标准库...

2487

扫描关注云+社区