持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第7天,点击查看活动详情
灵活的运用 tags来过滤数据
之前我们讲解过基于tags来过滤数据的功能,其实在真正的生产项目中,建议大家合理的规划Topic和里面的tags,一个Topic代表了一类业务消息数据,然后对于这类业务消息数据,如果你希望继续划分一些类别的话,可以在发送消息的时候设置tags。
基于消息key来定位消息是否丢失
怎么从MQ里查消息是否丢失呢?
可以基于消息key来实现,比如通过下面的方式设置一个消息的key为订单id:message.setKeys(orderId),这样这个消息就具备一个key了。
接着这个消息到broker上,会基于key构建hash索引,这个hash索引就存放在IndexFile索引文件里。
然后后续我们可以通过MQ提供的命令去根据key查询这个消息,类似下面这样:
mqadmin queryMsgByKey -n 127.0.0.1:9876 - t SCANRECORD -k orderI
具体的命令,大家可以去查官方手册。
消息零丢失方案的补充
MQ集群彻底故障了,此时就是不可用了,那么怎么办呢?
其实对于一些金融级的系统,或者跟钱相关的支付系统,或者是广告系统,类似这样的系统,都必须有超高级别的高可用保障机制。
一般假设MQ集群彻底崩溃了,你生产者就应该把消息写入到本地磁盘文件里去进行持久化,或者是写入数据库里去暂存起来,等待MQ恢复之后,然后再把持久化的消息继续投递到MQ里去。
提高消费者的吞吐量
如果消费的时候发现消费的比较慢,那么可以提高消费者的并行度,常见的就是部署更多的consumer机器。
但是这里要注意,你的Topic的MessageQueue得是有对应的增加,因为如果你的consumer机器有5台,然后MessageQueue只有4 个,那么意味着有一个consumer机器是获取不到消息的。
然后就是可以增加consumer的线程数量,可以设置consumer端的参数:consumeThreadMin、consumeThreadMax,这样一台 consumer机器上的消费线程越多,消费的速度就越快。
此外,还可以开启消费者的批量消费功能,就是设置consumeMessageBatchMaxSize参数,他默认是1,但是你可以设置的多一些, 那么一次就会交给你的回调函数一批消息给你来处理了,此时你可以通过SQL语句一次性批量处理一些数据,比如:update xxx set xxx where id in (xx,xx,xx)。
通过批量处理消息的方式,也可以大幅度提升消息消费的速度。