简单消息队列系统设计要点回顾

2021-4-9 10:32:25 星期五

总结一下最近一段时间使用消息队列作为生产者遇到的问题:

架构是这样的:

1. 数据库存储业务产生的基础信息, 状态为初始化 (高并发下顺序可能会不保证, 好在我们不对外, 并发性不高)

2. 定时脚本顺序扫描, 改状态为发送中, 组装完整信息, 写入到kafka

3. 发送成功后, 在kafka回调中更改状态为已完成 

4. 因消费者觉得没必要发送ack回调, 所以消息发送生命线到此结束

 

设计要点:

1. 可以随时终止消息发送,

  有一个数据库层面的配置, 每一行记录有topic, 环境, 是否发送等信息, 可以控制某个环境(生产, 测试), 某个topic是否发送

  要点: 如果设置为不发送, 系统每隔10分钟发送一次报警

2. 卡住的消息, 可以自动重发

  因为系统上线, 环境抖动等原因, 会导致消息卡在"发送中"的状态.

  根据状态重发: 每次发消息前会检查20分钟前写入数据库, 但是仍是"发送中"状态的数据, 如果有则报警, 并将消息状态改为初始化, 在下次重新尝试发送

3. 消息体重发

  有的消息已经发送, 但需要再发一次, 但是每条消息都有一个唯一的消息ID, 重发时, 注意要更改此唯一的消息ID或类似作用的值

4. 只卡一种类型的消息

        生产中会有很多种消息共用一个topic的情况, 考虑到消息的顺序性, 如果一种子类型的消息卡住了,  其后的消息都不能发送; 但是不能影响其他种类的消息发送

5. 报警

  最好是选择报警到钉钉群或微信群, 如果邮件的话, 会影响电脑或手机的正常使用

6. 忽略部分错误消息

  像kafka, 作为生产者, 如果连接broker失败, 是自己可以自动重试的, 但重试前的那次失败可以不用报警(错误码是-192)

  

  

相关文章

# 前言 现有主流消息中间件都是生产者-消费者模型,主要角色...
错误的根源是:kafka版本过高所致,2.2+=的版本,已经不需要...
DWS层主要是存放大宽表数据,此业务中主要是针对Kafka topic...
不多BB讲原理,只教你怎么用,看了全网没有比我更详细的了,...
终于写完了,其实最开始学kafka的时候是今年2月份,那时候还...
使用GPKafka实现Kafka数据导入Greenplum数据库踩坑问题记录(...