专栏首页程序员小明消息中间件(四):Rocket顺序消息之最佳实践

消息中间件(四):Rocket顺序消息之最佳实践

顺序消息

顺序消息缺陷

发送顺序消息无法利用集群Fail Over特性消费,顺序消息的并行度依赖于队列数量,存在队列热点问题,个别队列由于哈希不均导致消息过多,消费速度跟不上,产生消息堆积问题遇到消息失败的消息,无法跳过,当前队列消费暂停。

原理

produce在发送消息的时候,把消息发到同一个队列(queue)中,消费者注册消息监听器为MessageListenerOrderly,这样就可以保证消费端只有一个线程去消费消息。 注意:把消息发到同一个队列(queue),不是同一个topic,默认情况下一个topic包括4个queue

扩展

可以通过实现发送消息的队列选择器方法,实现部分顺序消息。 举例:比如一个数据库通过MQ来同步,只需要保证每个表的数据是同步的就可以。解析binlog,将表名作为队列选择器的参数,这样就可以保证每个表的数据到同一个队列里面,从而保证表数据的顺序消费。

最佳实践

Producer

  • Topic 一个应用尽可能用一个Topic,消息子类型用tags来标识,tags可以由应用自由设置。只有发送消息设置了tags,消费方在订阅消息时,才可以利用tagsbroker做消息过滤。
  • key 每个消息在业务层面的唯一标识码,要设置到 keys 字段,方便将来定位消息丢失问题。服务器会为每个消息创建索引(哈希索引),应用可以通过 topic,key来查询这条消息内容,以及消息被谁消费。由于是哈希索引,请务必保证key 尽可能唯一,这样可以避免潜在的哈希冲突。
//订单Id
String orderId= "20034568923546";
message.setKeys(orderId);
  • 日志 消息发送成功或者失败,要打印消息日志,务必要打印 send resultkey 字段。
  • send send消息方法,只要不抛异常,就代表发送成功。但是发送成功会有多个状态,在sendResult里定义。 SEND_OK:消息发送成功 FLUSH_DISK_TIMEOUT:消息发送成功,但是服务器刷盘超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失 FLUSH_SLAVE_TIMEOUT:消息发送成功,但是服务器同步到Slave时超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失 SLAVE_NOT_AVAILABLE:消息发送成功,但是此时slave不可用,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失

Consumer

  • 幂等 RocketMQ使用的消息原语是At Least Once,所以consumer可能多次收到同一个消息,此时务必做好幂等。
  • 日志 消费时记录日志,以便后续定位问题。
  • 批量消费 尽量使用批量方式消费方式,可以很大程度上提高消费吞吐量。

参考资料

分布式开放消息系统(RocketMQ)的原理与实践 http://www.jianshu.com/p/453c6e7ff81c RocketMQ事务消费和顺序消费详解 http://www.cnblogs.com/520playboy/p/6750023.html

本文分享自微信公众号 - 程序员小明(coderxinqiji)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-24

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RabbitMQ实现商城订单超时处理

    DLXMessage是一个消息封装对象,很关键,发送延迟队列时,先把消息存在此对象中,在加上目的地队列名称,然后再发到死信队列中,当消息超时时,转发到转发队列,...

    程序员小明
  • Java中的try,如何开启新姿势?

    其实,JDK 7就已经引入了对try-with-resources的支持,它的主要作用就是解放小明和小明小伙伴们的双手,帮助我们自动释放资源(比如输入、输出流)...

    程序员小明
  • 消息中间件(三):Rocketmq如何支持分布式事务消息

    A(存在DB操作)、B(存在DB操作)两方需要保证分布式事务一致性,通过引入中间层MQ,A和MQ保持事务一致性(异常情况下通过MQ反查A接口实现check),B...

    程序员小明
  • 关于 MQ ,你必须知道的

    如上图,在不使用消息队列服务器的时候,用户的请求都直怼数据库,在高并发的情况下数据库压力剧增,不仅使得响应速度变慢,还可能因此而挂掉数据库,导致用户页面直接报错...

    lyb-geek
  • 消息队列MQ

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    chenchenchen
  • 关于MQ,你必须知道的事情

    如上图,在不使用消息队列服务器的时候,用户的请求都直怼数据库,在高并发的情况下数据库压力剧增,不仅使得响应速度变慢,还可能因此而挂掉数据库,导致用户页面直接报错...

    黄泽杰
  • 大型网站架构系列:消息队列(二)

    本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka)。 【第二篇...

    小小科
  • 消息队列——ActiveMQ使用及原理浅析

    什么是消息中间件?随着业务的急速增长以及分布式架构的逐渐兴起,首先要考虑的就是如何高效的在各节点之间传递消息,其次要考虑的是流量洪峰时如何削减系统的压力以及跨平...

    夜勿语
  • java分布式面试题之消息队列ActiveMQ部分

    如果是传统的集中式架构,实现这个功能非常简单:开启一个本地事务,往本地数据库中插入一条用户数据,发送验证码,提交事物。但是在分布式架构中,用户和发送验证码是两个...

    Java搬砖工人
  • 消息队列使用的四种场景介绍

    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题

    lyb-geek

扫码关注云+社区

领取腾讯云代金券