旅游网站开发目的和意义,通州企业网站建设,万网域名网站建设,建三江佳木斯网站建设总的来讲#xff0c;消息队列常见问题要么消息不能多#xff0c;要么不能少#xff0c;还有顺序性#xff0c;以及积压处理的问题等。
1.消息不能多
也就是说#xff0c;消息不能重复消费#xff0c;随之带来的幂等性问题。
解决#xff1a;一般结合业务场景#xf…总的来讲消息队列常见问题要么消息不能多要么不能少还有顺序性以及积压处理的问题等。
1.消息不能多
也就是说消息不能重复消费随之带来的幂等性问题。
解决一般结合业务场景有一个唯一key比如通过主键写的场景。通过校验主键是否存在的方式来防止重复写而且主键重复也会在数据库报错。
2.消息不能少
也就是说消息丢失的问题。这里我们先从消息队列的大致的架构上我们了解到大致分为生产者MQ自身broker以及消费者。那么分分三个角度来看这个问题
1生产者消息丢失 原因在发送到broker过程中可能因为网络故障的原因导致消息丢失。 解决不同的组件解决方式可能不一样但是大致思路是相似的。 就rabbitmq而言有两种模式事务模式和confirm模式都可以解决。首先事务模式发送消息的时候开启事务当有异常发生时进行回滚事务并重新发送。但是这样搞得化势必会降低吞吐量和性能。再谈confirm模式也就是当生产者写到MQ之后MQ发送ok给生产者告知写成功如果写入失败就回调一个nack接口。然后重新发送。 就kafka而言设置ackall当所有的replica写入成功才算做写入成功如果没有成功就无限重试。 就rocketmq而言。也是两种方式一种是本地消息表定时扫描一种也是事务。第一种一般是把异常的消息保存的消息表中然后定时查看表中消息的状态如果发送失败就重试。另一种事务也就是发送消息之前开启半事务然后发送失败时不执行事务。若发送成功根据事务执行的结果判断提交还是回滚。
2MQbroker消息丢失 原因在发送到mq之后mq先载入到内存这时宕机。或者kafka的leader切换follower过程中partition的follower并没有把信息同步完成这时候宕机。 解决不同的组件解决方式可能不一样但是大致思路是相似的。 就rabbitmq而言开启持久化创建queue时持久化以及发送消息时的deliveryMode设为2。并结合前面的confirm模式也就是当持久化成功后再confirm不然重试。 就kafka而言一般是调整参数topic的replication数大于1kafka的replicas大于1producer端ack设为allretry设置为max。 就rocketmq而言持久化到磁盘默认策略时异步刷盘改为同步刷盘。但是这样也会造成吞吐量下降所以还需结合具体业务场景。
3消费端消息丢失 原因消费端获得消息后并没来得及处理这是发生宕机。那么mq会以为已经处理过那么这条消息就会丢失。 解决不同的组件解决方式可能不一样但是大致思路是相似的。 就rabbitmq而言关闭自动ack使用手动提交。 就kafka而言关闭自动ack使用手动提交。 就rocketmq而言默认就是手动提交一般不会丢失。
3.顺序性问题 一般读写操作都要注意。 解决大致思路就是在发送消息的时候可以根据相同的key比如说业务主键来确定这条消息打入到同一个queue中然后这个queue也指定一个consumer来消费。这个consumer中可以内部开启多个线程一个线程对应消费一个内存queue。