zoukankan      html  css  js  c++  java
  • 如何保证消息队列的顺序性?

    或者:如何保证从消息队列里拿到的数据按顺序执行?

    解决方案的关键是在消费者消费之前,将有相关性的数据按顺序写入同一个队列(queue或者是内存队列)

    1、rabbitMQ   中,有个默认是数据1进入一个queue并且只会被一个消费者消费

      场景:(1queue对多consumer)三个消息按顺序写进了1个queue,但是这个queue对应了三个consumer,最终插入DB的顺序错乱了,原本是增删改,可能最后变成了改增删

      图例:

    解决方法:拆分多个queue,每个queue对应一个consumer,有相关性的数据按顺序写入一个queue,consumer按顺序消费。consumer内部用内存队列做排队,然后分发给底层不同worker来处理。

    2、kafka  默认是一个partition只能被一个消费者消费

      场景:在最后消费的时候,由于追求吞吐量,采用了多线程处理消费,数据的顺序写库乱了

    解决方案:消费者采用多线程消费消息之前,将相同订单ID的数据,订单ID数据hash一下写入同一个内存队列(是有顺序的),然后交给线程去处理。

    注:由于单线程一条消息要处理几十ms,一秒钟只能处理几十条,吞吐量太低了。

    多线程压测最高是消费者是4核8G的机器  单机,32条线程,最高每秒处理上千条消息。

  • 相关阅读:
    springboot2.1.3使用jdbcTemplate
    httpclient4.5.2 Post请求支持http和https
    springboot2.1.3+spring-session2.1.4分库处理
    mysql查看当前实时连接数
    springboot2.1.3+Junit4 单元测试
    subprocess.Popen()详解
    matplotlib 设置图形大小时 figsize 与 dpi 的关系
    matplotlib之subplot
    matplotlib.pyplot.plot()参数详解
    plt.rcParams属性总结
  • 原文地址:https://www.cnblogs.com/blackdd/p/12387422.html
Copyright © 2011-2022 走看看