当前位置: 首页 > news >正文

chat聊天系统消息消费时遇到的问题及优化思路(二)

1、前言

考虑下面几个条件下如何提升kafka的消费速度

  • 消息要求严格有序,如chat聊天消息
  • 业务处理速度慢,如处理一条数据需要100ms
  • 分片不合理,如有的分区很闲,有的分区消息数量积压

2、解决方案

1、顺序问题

关于消息消费时存在先后顺序问题,在chat聊天系统消息消费时遇到的问题及优化思路(一)中已经加以说明。具体实现大致为对同一会话、帖子Id等维度放入同一分区中,如使用Id % 分区数,如下图:
在这里插入图片描述
上面的解决方案是将同一会话的消息发送至同一分区进行消费,但是但消费者的消费能力大概率是不够的,因此,需要并发处理,详见
chat聊天系统消息消费时遇到的问题及优化思路(一)
在这里插入图片描述
注意:此时需要注意一个问题就是,当单个消费者消费分区,并将获取到的消息放入不同的队列中,此时还可能存在乱序问题,所以,可以考虑复用Id%队列数的方式,将同一个会话的消息放入到相同的队列中,让协程进行消费。

2、消息不丢失问题

上面的方案,当消费者从kafka拉到消息后,并没有等待处理完成就继续从kafka拉取消息然后缓存到内存中,等待消费队列慢慢消费,这个时候如果机器宕机,则内存中的消息将会丢失。

基于上面描述的问题,考虑使用手动提交offset。但是这样其实还存在一个问题就是:各个协程处理的offset值其实是不一样的,如下图:
在这里插入图片描述
此时goroutine1和goroutine2 的消息的offset不一致,为了保证消息不丢失,采用以下策略:定期手动提交当前的offset信息,提交的offset值选当前分区的最小的offset,如上面的就选1001这个offset值。可以采用在内存中缓存处理的offset列表的实现方式,如下:
在这里插入图片描述
当内存中待处理的最大offset与最小的offset差值>= M时,阻塞消费小城继续从kafka拉取消息,控制异常情况下的数据最多不多于M条
但是此时会引进一个新问题:消息重复消费

此时要保证消息消费的幂等性,如可通过消息唯一标识放入如redis中判断

3、消息堆积问题

堆积原因:

  • 生产者短时间生产大量消息到broker,消费者无法及时消费,如大促
  • 生产者无法感知消息堆积,仍继续生产消息,导致消息堆积进一步加剧
  • 消费者能力不足,消费时间长,消费者宕机、网络异常与broker无法通信
  • 业务功能存在bug,导致消费者无法消费

解决方案
消费者端

  • 增加消费者数量,并采用并发消费
  • 提高消费速度,避免消费时间过长。如果单条消息消费时间无法优化,可以提高批次拉取的数量(当批次拉取的数量较少时,拉取数据量/处理时间 < 生产速度时就容易堆积)
  • 消费消息时尽量减少耗时操作,尽量减少三方接口调用、读写库等
  • 合理设置消费组服务数量,合理增加topic的partition=个数,消费者数 >= 分区数
  • 补偿消费,即消费跳过积压数据,直接消费最新的数据,同时启动补偿数据进程消费积压数据

生产者端

  • 支持熔断与隔离,当broker消息积压时,对生产者熔断
  • 根据key采用合适的算法,将消息均匀分不到对应的分区中

服务端

  • 进行预估,设置合理的分区数

在电商中经常大促,因此很容易出现短时间内产生大量消息的问题,因此在大促前可根据历史情况进行容量预估和相关的扩容策略。

参考:

我是如何将一个老系统的Kafka消费者服务的性能提升近百倍的

相关文章:

chat聊天系统消息消费时遇到的问题及优化思路(二)

1、前言 考虑下面几个条件下如何提升kafka的消费速度 消息要求严格有序&#xff0c;如chat聊天消息业务处理速度慢&#xff0c;如处理一条数据需要100ms分片不合理&#xff0c;如有的分区很闲&#xff0c;有的分区消息数量积压 2、解决方案 1、顺序问题 关于消息消费时存在…...

js正则中的match()

在前端开发中&#xff0c;正则表达式是一大利器。所以我们这次就来讨论下match()方法。 match本身是JavaScript语言中字符串对象的一个方法&#xff0c;该方法的签名是 match([string] | [RegExp]) 它的参数既可以是一个字符串&#xff0c;也可以是一个正则表达式。该方法绝…...

Apache 配置和应用

目录 构建虚拟 Web 主机 Options指令解释 Options指令常用选项 AllowOverride指令解释&#xff1a; 地址限制策略&#xff1a; httpd服务支持的虚拟主机类型包括以下三种: 基于域名的虚拟主机 1&#xff0e;为虚拟主机提供域名解析 2.为虚拟主机准备网页文档 3.添加虚拟…...

实现PyTorch/ONNX自定义节点操作的TensorRT部署

参考一 下面是基本步骤&#xff1a; 加载训练好的bev transformer网络权重参数&#xff1a; import torch from model import Modelmodel Model() model.load_state_dict(torch.load("path/to/weights"))定义新的自定义操作&#xff1a; import torch from torc…...

Shamir 秘密共享、GMW和BGW方案

一、Shamir秘密共享 Shamir秘密共享方案是一种将秘密拆分成多份并分配给多个参与者保存&#xff0c;只有在满足特定条件下才能恢复原始秘密的密码学方案。它具有良好的容错性、加法同态性和无条件安全性等特点。 具体地&#xff0c;Shamir秘密共享方案可以概括为以下步骤&…...

Day56【动态规划】583.两个字符串的删除操作、72.编辑距离

583.两个字符串的删除操作 力扣题目链接/文章讲解 视频讲解 1、确定 dp 数组下标及值含义 dp[i][j]&#xff1a;以下标 i 为结尾的字符串 word1&#xff0c;和以下标 j 为结尾的字符串 word2&#xff0c;想要达到相等&#xff0c;所需要删除元素的最少次数为 dp[i][j] 2、…...

Arnold图像置乱的MATLAB实现

这件事情的起因是这样的&#xff0c;我需要研究一下各种图像置乱的算法。然后在知乎上找到了一篇关于Arnold变化的文章&#xff0c;但是呢&#xff0c;这个人实际上是卖资料&#xff0c;代做大作业的。详细的代码根部不给你&#xff0c;则给我气坏了&#xff0c;必须要手动实现…...

ASP.NET Core

1. 入口文件 一个应用程序总有一个入口文件&#xff0c;是应用启动代码开始执行的地方&#xff0c;这里往往也会涉及到应用的各种配置。当我们接触到一个新框架的时候&#xff0c;可以从入口文件入手&#xff0c;了解入口文件&#xff0c;能够帮助我们更好地理解应用的相关配置…...

javascript基础二十二:举例说明你对尾递归的理解,有哪些应用场景

一、递归 递归&#xff08;英语&#xff1a;Recursion&#xff09; 在数学与计算机科学中&#xff0c;是指在函数的定义中使用函数自身的方法 在函数内部&#xff0c;可以调用其他函数。如果一个函数在内部调用自身本身&#xff0c;这个函数就是递归函数 其核心思想是把一个大型…...

hive中如何计算字符串中表达式

比如 select 1(2-3)(-4.1-3.1)-(4-3)-(-3.34.3)-1 col ,1(2-3)(-4.1-3.1)-(4-3)-(-3.34.3)-1 result \ 现在的需求式 给你一个字符串如上述col 你要算出result。 前提式 只有和-的运算&#xff0c;而且只有嵌套一次 -(4-3)没有 -(-4(3-(31)))嵌套多次。 第一步我们需要将运…...

如何将maven项目改为springboot项目?

将 Maven 项目转换为 Spring Boot 项目需要进行以下步骤&#xff1a; 1. 在 Maven 项目中添加 Spring Boot 的依赖。可以通过在 pom.xml 文件中添加以下依赖来实现&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>…...

Java与查找算法(5):哈希查找

一、哈希查找 哈希查找&#xff0c;也称为散列查找&#xff0c;是一种基于哈希表的查找算法。哈希表是一种数据结构&#xff0c;它将键&#xff08;key&#xff09;映射到值&#xff08;value&#xff09;&#xff0c;使得查找某个键对应的值的时间复杂度为O(1)。哈希查找的过…...

Vercel部署个人博客

vercel 部署静态资源网站极其方便简单&#xff0c;并且有可观的访问速度&#xff0c;最主要的是免费部署。 如果你还没有尝试的话&#xff0c;强烈建议去使用一下。 演示博客演示http://202271.xyz/?vercel vercel 介绍 注册账号 进入Vercel官网https://vercel.com&#x…...

【论文阅读】An Object SLAM Framework for Association, Mapping, and High-Level Tasks

一、系统概述 这篇文章是一个十分完整的物体级SLAM框架&#xff0c;偏重于建图及高层应用&#xff0c;在前端的部分使用了ORBSLAM作为基础框架&#xff0c;用于提供点云以及相机的位姿&#xff0c;需要注意的是&#xff0c;这篇文章使用的是相机&#xff0c;虽然用的是点云这个…...

《metasploit渗透测试魔鬼训练营》学习笔记第六章--客户端渗透

四.客户端攻击 客户端攻击与服务端攻击有个显著不同的标识&#xff0c;就是攻击者向用户主机发送的恶意数据不会直接导致用户系统中的服务进程溢出&#xff0c;而是需要结合一些社会工程学技巧&#xff0c;诱使客户端用户去访问这些恶意数据&#xff0c;间接发生攻击。 4.1客户…...

华为OD机试真题 Java 实现【Linux 发行版的数量】【2023Q1 100分】

一、题目描述 Linux 操作系统有多个发行版,distrowatch.com 提供了各个发行版的资料。这些发行版互相存在关联,例如 Ubuntu 基于 Debian 只开发而 Mint 又基于 Ubuntu 开发,那么我们认为 Mint 同 Debian 也存在关联。 发行版集是一个或多个相关存在关联的操作系统发行版,…...

VMware ESXi 8.0U1a macOS Unlocker OEM BIOS (标准版和厂商定制版)

VMware ESXi 8.0 Update 1a macOS Unlocker & OEM BIOS (标准版和厂商定制版) ESXi 8.0U1 标准版&#xff0c;Dell HPE 联想 浪潮 定制版 请访问原文链接&#xff1a; https://sysin.org/blog/vmware-esxi-8-u1-oem/&#xff0c;查看最新版。原创作品&#xff0c;转载请保…...

Effective STL_读书笔记

Effective STL 1. 容器条例01&#xff1a;慎重选择容器类型条例02&#xff1a;不要试图编写独立于容器类型的代码条例03&#xff1a;确保容器中对象的拷贝正确而高效条例04&#xff1a;调用empty而不是检查size()是否为空条例05&#xff1a;区间成员函数优先于与之对应的单元素…...

通过yum:mysql5.6-msyql5.7-mysql8.0升级之路

一 前言 mysql的yum源 https://dev.mysql.com/downloads/repo/yum/ https://dev.mysql.com/get/mysq57-community-release-el7-7.noarch.rpm服务器信息 2c2g40GB [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# una…...

C语言数据存储 — 整型篇

C语言数据存储 — 整型篇 前言1. 数据类型介绍1.1 类型的基本分类 2. 整型在内存中的存储2.1 原码、反码、补码2.1.1 为什么数据存放在内存中存放的是补码 2.2 大小端介绍2.2.1 什么是大小端&#xff1f;2.2.2 为什么有大端和小端&#xff1f;2.2.3 一道百度系统工程师笔试题 3…...

Saleor:应对现代电商架构挑战的无头商业引擎解决方案

Saleor&#xff1a;应对现代电商架构挑战的无头商业引擎解决方案 【免费下载链接】saleor Saleor Core: the high performance, composable, headless commerce API. 项目地址: https://gitcode.com/gh_mirrors/sa/saleor 在数字化转型浪潮中&#xff0c;电商平台面临的…...

一个电商项目 开发的完整流程是什么==从0 疑难杂症

--- 一、从0开始的完整流程&#xff08;时间顺序&#xff09;0&#xff09;立项&#xff1a;先定“能赚钱的最小闭环”先别谈技术&#xff0c;先定这4件…...

为了还原具身智能科研市场的全貌,我们找了多个头部高校聊聊

具身智能「最大客户说」 在具身智能所有喧嚣的落地故事里&#xff0c;科研市场是最沉默也最关键的那一个。 这是无数创业公司拿到的第一笔真正意义上的收入&#xff0c;帮助团队度过了最艰难的从0到1的商业化探索阶段&#xff0c;也让机器人本体在成百上千次的拆解、改装、调…...

Taotoken的Token Plan套餐如何让我的消费更可控

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken的Token Plan套餐如何让我的消费更可控 1. 从按量计费到Plan套餐的决策 在持续使用大模型API进行项目开发的过程中&#…...

想在手机上实现专业级AI歌声转换?so-vits-svc让这一切变得触手可及!

想在手机上实现专业级AI歌声转换&#xff1f;so-vits-svc让这一切变得触手可及&#xff01; 【免费下载链接】so-vits-svc SoftVC VITS Singing Voice Conversion 项目地址: https://gitcode.com/gh_mirrors/so/so-vits-svc 你是否曾经梦想过&#xff0c;能用手机随时随…...

TokUnion 技术架构解析:AI+GEO 驱动的跨境增长数据闭环设计

摘要最近这个时间段&#xff0c;是国货出海精细化与合规化转型背景的深度期&#xff0c;传统粗放式广告投放&#xff0c;和单一渠道运营模式面临获客成本高、ROI 不可控、数据孤岛、合规风险突出等问题。下面这个文章&#xff0c;我会以TokUnion数字化协同体系为研究对象&#…...

Windows 11系统优化终极方案:用Win11Debloat免费提升电脑性能

Windows 11系统优化终极方案&#xff1a;用Win11Debloat免费提升电脑性能 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter…...

终极指南:如何利用Py Eddy Tracker实现海洋中尺度涡旋高效识别与追踪

终极指南&#xff1a;如何利用Py Eddy Tracker实现海洋中尺度涡旋高效识别与追踪 【免费下载链接】py-eddy-tracker Eddy identification and tracking 项目地址: https://gitcode.com/gh_mirrors/py/py-eddy-tracker 海洋涡旋识别与中尺度涡旋追踪是海洋科学研究中的核…...

告别虚拟机!用WSL2自带的SSH服务连接VSCode远程开发(附端口冲突解决)

告别虚拟机&#xff01;用WSL2自带的SSH服务连接VSCode远程开发&#xff08;附端口冲突解决&#xff09; 在Windows系统上进行Linux开发时&#xff0c;传统虚拟机方案往往显得笨重且资源占用高。WSL2的出现彻底改变了这一局面&#xff0c;它提供了近乎原生的Linux内核体验&…...

别再手动拼图了!用Godot4的TileMap快速搭建2D游戏场景(附图层与相机跟随技巧)

别再手动拼图了&#xff01;用Godot4的TileMap快速搭建2D游戏场景&#xff08;附图层与相机跟随技巧&#xff09; 在独立游戏开发中&#xff0c;场景搭建往往是耗时最长的环节之一。许多新手开发者习惯用Sprite节点逐个摆放场景元素&#xff0c;这不仅效率低下&#xff0c;后期…...