消息队列使用常见问题

embedded/2024/11/15 8:43:34/

一、消息丢失的时机?

  1. 生产端消息丢失
    问题:因为网络异常导致消息发送失败,此时可能会产生消息丢失的情况,重试后可能产生消息重复生产的情况。
    解决:超时重试,并在消费端保证幂等性。

  2. 消息队列中消息丢失
    问题:如kafka是将数据存储在磁盘,如果每条消息写入时都立马存储在磁盘中会产生很多随机IO,随机IO耗时很高,因此数据是先写入缓冲区中,再根据特定的时机刷新到磁盘中,减少随机IO的开销。假设还未刷新到磁盘就出现宕机情况,则会产生消息丢失的情况。
    解决:可以考虑以集群方式部署Kafka服务,通过部署多个副本备份数据保证消息尽量不丢失。

  3. 消费端消费时丢失
    问题:消费者消费消息的进度是记录在消息队列集群中的,而消费的过程分为三步:接收消息、处理消息、更新消费进度。消费端网络抖动或者消费端业务逻辑异常导致中断,此时会产生消息丢失的情况。
    解决:一定要等到消息接收和处理完成后才能更新消费进度,但是这也会造成消息重复的问题,比方说某一条消息在处理之后消费者恰好宕机了,那么因为没有更新消费进度,所以当这个消费者重启之后还会重复地消费这条消息。

二、如何避免重复消费?

  1. 生产端重复发送
    kafka支持生产端幂等,这种特性保证消息虽然可能在生产端产生重复,但是最终在消息队列存储时只会存储一份。
    它的做法是给每一个生产者一个唯一的ID,并且为生产的每一条消息赋予一个唯一ID,消息队列的服务端会存储<生产者ID,最后一条消息ID>的映射。当某一个生产者产生新的消息时,消息队列服务端会比对消息ID是否与存储的最后一条ID一致,如果一致就认为是重复的消息,服务端会自动丢弃。

  2. 消费端幂等
    解决1:在生产时定义一个全局的唯一id,在消费端判断id是否被处理过。
    解决2:数据库增加版本字段,执行sql时会有乐观锁。

三、减少消息延迟的方式?

  1. 优化消费端耗时逻辑。
  2. 增加消费者数量,在kafka中一个partition只能被一个消费者消费,所以单纯增加消费者数量对kafka来说是无用的,可以增加partition。

http://www.ppmy.cn/embedded/37977.html

相关文章

3dmax-vray6渲染器参数设置

适用于3dmax2018-2023版本 一、【公用】 小图输出大小:1500*1125&#xff0c;勾选大气、效果&#xff1b; 大图输出大小:3000*2250&#xff0c;勾选大气、效果、置换&#xff1b; 二、【vray】 小图抗锯齿类型:渐进式&#xff1b;最小细分:1&#xff0c;最大细分:100&#…

农村公交与异构无人机协同配送优化

针对农村公交与异构无人机协同配送的优化问题,可以从以下几个方面进行探讨: 1. 融合公交与无人机配送 公交物流体系:利用农村公交网络,建立以公交车辆为基础的物流配送体系。公交车辆可以沿途收集或投递货物,提高物流配送效率。无人机辅助配送:在公交物流体系的基础上,…

JAVA语言程序设计1(第七章)

一、编程思想 1. 面向过程&#xff1a; (1) 面向过程&#xff1a;将问题分为第一步、第二步、第三步... 直到问题解决 (2) 问题&#xff1a;解决小业务相对比较简单&#xff0c;但是面对复杂业务时&#xff0c;相对不好处理 2. 面向对象&#xff1a; (1) 面向对象&#…

.Wormhole勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言&#xff1a; 随着信息技术的飞速发展&#xff0c;网络安全问题愈发凸显其重要性。近年来&#xff0c;勒索病毒成为了网络安全领域的一大难题&#xff0c;而其中的.Wormhole勒索病毒更是以其独特的传播方式和强大的破坏力引起了广泛关注。本文将详细介绍.Wormhole勒索病毒…

linux系统 虚拟机的安装详细步骤

window&#xff1a; (1) 个人&#xff1a;win7 win10 win11 winxp (2)服务器&#xff1a;windows server2003 2008 2013 linux&#xff1a; (1)centos7 5 6 8 (2)redhat (3)ubuntu (4)kali 什么是linux: 主要是基于命令来完成各种操作&#xff0c;类似于DO…

C++中的构造函数以及默认拷贝构造函数

构造函数 构造函数是在创建类的新对象时自动调用的函数&#xff0c;用于初始化对象的状态。构造函数的名称与类名相同&#xff0c;没有返回类型。 基本构造函数类型&#xff1a; 默认构造函数&#xff1a; 定义&#xff1a;没有参数的构造函数&#xff0c;或者是所有参数都有…

【VueUse库各模块函数使用方法系列---Browser模块下篇】

vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Browser模块各函数简介及使用方法 vueUseBrowser函数1. `useScript…

etcdv3.6源码流程---compact

总括&#xff1a; 因为bbolt数据库的内容中&#xff1a;key(revision,version),value(elemkey,elemvalue)&#xff0c;treeIndex中keyelemkey,value[]generation,而generation包含一个key的所有版本&#xff0c;也就是说treeIndex中的value就是bbolt中的key。因为treeIndex中包…