3.消息中间件.txt

UP 返回
1.项目中哪些地方用到MQ
	包装的kafka。对一些比较耗时的操作交给mq
	1.分布式定时任务
	2.热点的很多消费 比如算法计算的结果 后验数据
	3.异步的语音生产
	4.生产方 专题审核通过->商业化的消费
	5.短信 邮件 WeLink消息发送

2.mq的特性
	异步处理
	实现解耦(生产者和消费者可以不在一起,如果在一起,一个服务宕机就会全部坏掉。而且异步的话还会争抢cpu资源,影响原流程)
	流量削峰(减少了流程耗时,tomcat有同时运行的线程数限制)
	
3.如何避免消息堆积
	生产者和消费者速率不匹配时可能导致消息堆积
	rabbitmq消费成功时消息会被立即删除;kafka和rocketmq消费成功不会立即删除消息

	提高消费者消费的速率,比如实现集群(同一个组中多个消费者不会重复消费同一条消息)
	批量获取消息,减少传输次数

4.如何保证消息不丢失
	MQ服务端:消息持久化到硬盘
	生产者:消息确认机制(必须确认mq将消息持久化到硬盘中才认为发送成功)
	消费者:确认消费成功(rabbitmq确认消费成功后删除消息;kafka和rocketmq消费成功后提交offset,通过配置决定什么时候删除消息)

5.如何保证消息顺序一致性
	mq服务器集群或者mq采用分区模型架构存放消息,每个分区对应一个消费者,这时就可能导致消费的消息顺序不一致(比如有3个消息分别是插入 修改 删除,就需要确保顺序)
	大多数情况无需保证消息一致性

	所以核心就是要将消息全部投递到同一个分区,最终被同一个消费者消费,,只要设置相同的key,进行取模就可以投放到同一个分区。但是为了保证顺序就可能降低消费速率(基于此也可以将消费改成一次消费多条)

6.消费幂等
	消费者如果消费失败,mq服务器会间隔的形式重试

	重试的过程需要保证业务的幂等,不能够重复执行
	通过全局的消息id,提前查询该业务逻辑是否已经执行过
	需要在数据库层面保证幂等,唯一主键约束








DOWN 返回