消息中心项目
- 什么是消息队列,使用消息队列的好处是什么
使用消息队列的目的总的来说可以有三种情况:解耦、异步和削峰
解耦:解决系统直接的依赖关系,提升系统的性能。对个个系统进行拆分。
如果出现其他系统接口问题,就会导致整个系统挂掉
削峰:假如并发量一下子达到了3000条数据,有两台机器,每台机器只能消费1000的并发量吗,多出1000就可能导致我们系统崩溃。>
这里我们可以使用消息队列,每次从队列中拿1000的数据
- **
使用消息队列会出现什么问题
**
- 问题1
搭建mq集群高可能,防止数据丢失,数据本地持久化,使用镜像队列
-
队列创建
-
问题2
数据重复消费如何处理,使用幂等性出来
方案1 - 对数据进行md5加密,写到队列中,当消费端获取到指定队列的数据,先写入数据,判断是否存在,对数据库字段建立唯一性索引。如果存在报错,说明当前数据已经存在,ack在队列中剔除当前消息
方案2 把数据唯一性id写道redis的zset方法中,判断redis存不存在,已经存在说明当前消息,需要剔除
方案3 使用redis分布式锁来操作
-
问题3
当mq队列产生大量数据如何处理,开启多线程
- 问题4
如果还出现消费过慢,对消费端机器进行横向扩容
什么场景我们会使用到队列呢?
比如信息管理系统
由web页面进行新增模板页面,在模板上配置不同的消息渠道,消息内容。
模板信息写入到redis,加快读速度。
对其他各个业务系统对应的模板id,最终会在结果表产生一条记录,如果失败会通过定时任务xxl-job来定时扫描,失败次数超过三次的会进行邮件通知对于的业务人员.
生产端通过HAProxy进行消息路由到不同的MQ集群队列中,使用HAProxy就是可以方便的监听指定的队列信息。
这边不同的消费端消费指定的队列信息,业务端会通过消息内容,把消息写入到不同的队列中,由不同的队列进行消费。
需要考虑,怎么加快接口的性能,给到其他的各个业务系统。
模板,系统参数写入到redis加快读操作。
使用线程池加快数据组装。