【最后203篇系列】015 几种消息队列的思考
背景
队列还是非常重要的中间件,可以帮助我们:提高处理效率、完成更复杂的处理流程
最初,我觉得只要掌握一种消息队列就够了,现在想想挺好笑的。
过去的探索
因为我用python,而rabbitmq比较贴合快速和复杂的数据处理,然后就选了这款。一开始我觉得不靠谱,服务老是断了,后来发现,是因为ubuntu做服务器如果用wifi的话天然容易这样。当时不明白为什么,所以弃用了rabbitmq一段时间。
后来再次使用时,功能倒是大体ok了,在早期版本好像直接支持延时消息啥的,当时都把插件装上搞好了。后来又觉得rabbitmq的并发太小了,在大规模etl的时候比较吃不消。所以又弃用了。
再后来,我想搞一些简单,使用一点的队列,于是搞了redis stream。在某些方面的确也还挺好用,速度和吞吐都还比较大。但是是吃内存的,而且在后来也出过一次问题:在维持十几个队列进行大量流转时,我发现有些队列失效了,要删除才能释放内存。这样的隐患看起来更大,所以又多少被打入冷宫。
兜兜转转又回到了kafka。这个是最早我比较排斥的,因为看起来比价麻烦,而且更偏向java。但搭起来的确很好用,吞吐大,也不需要内存,主要依赖硬盘。但是kafka搭起来稍微麻烦一点,组要zookeeper,而且对网络和机器资源的要求很高。有一次,我不确定是不是kafka的问题,把我一台机器的网络整个带崩了。当然大部分时候也是没问题的。
后来也陆续看了一些队列,但类型也就是上面三种了,差异不大。还有个zmq,感觉是更底层的队列转发,没去管了。
一些对应的结论:
- 1 rabbitmq 可以在稍微小的场景用,功能可以比较全面,方便重试等
- 2 redis 把持久化去掉,不需要了,这样万一stream出问题重启服务就行
- 3 kafka 适合保存大量的对话日志,有7天滚动删除,需要用资源稍微高一点的机器运行
新的思考
最近碰到一些问题,又触发了我关于这方面的思考。
问题1:一个同事抱怨请求的微服务失败率过高,任务失败后他的重试比较难搞?
问题2:机器人会有很多零散的数据需要向量化,而现有的向量化微服务是处理批量的,这样导致了能力无法输出?
问题3:大模型不断出新的模型,以及现有的接口价格还是稍贵(虽然已经是业内最低),如何能确保替换?
对于问题1,后来我发现还是数据连接失活的问题,已经解决掉了。但如果是大模型接口不稳定导致的问题,应该如何解决呢? – RabbitMQ
由于调用大模型处理的需求一般都是比较昂贵且缓慢的,这意味着天然的并发就不会太高。RabbitMQ即使在消息体很大的情况下,应该也能做到2000左右的并发(这个后续我可以压一下),那样在并发处理上就够了。
然后利用rabbitmq本身丰富的机制,比如死信队列这种来完成重试。

这样可以应对接口的不稳定调用情况,减少我们自己进行失败的检查和调度。
对于问题2,应该就是做一个微批次服务了。服务端用队列接收请求,只有到一定批次时或者到指定轮询时间(1s),服务才会处理队列的数据,此时就可以发挥服务的批量处理效率了。这对于矩阵处理类的服务特别有效,使用redis stream这样简单的队列来完成这种服务正好。 – Redis Stream。
对于问题3,那么就是一个广播的过程。用kafka比较合适,一方面可以支持很大的吞吐,然后对于不同的消费者,这时应该是不同的模型都可以重复消费。每一个input,只存一次,在kafka,然后可以被重复消费,消费的结果进行实时比对。胜利的模型上台,失败的模型退位。
还有一个比较让我本能抗拒的问题,但其实应该是可以的,后面我也要尝试。
【实时队列服务】服务只是一个消息入口,并不直接处理,而是发到kafka。然后由多个worker盯着kafka进行消费。
这种间接服务是有点不靠谱的,抛开入口服务不谈,这里有kafka队列和worker两个不稳定因素。但如果可行的话,这样反而是比较好的:
- 1 数据存在历史(7天缓存),必要的时候可以追溯和回放
- 2 数据存到kafka,可以有更高的弹性处理能力,对那些延时要求不高的,比如允许timeout 30秒的任务来说肯定是可以的
worker处理完之后进行返回 ,可以采用webhook, websocket或者sse的方式将结果实时的返给请求。
【复杂ETL流转】将数据的处理抽象为在若干个kafka之间进行流转。
这样最大的好处是可以让不同人/流程之间的交互变的简单,可能会稍微费点硬盘,但应该是值得的。
相关文章:
【最后203篇系列】015 几种消息队列的思考
背景 队列还是非常重要的中间件,可以帮助我们:提高处理效率、完成更复杂的处理流程 最初,我觉得只要掌握一种消息队列就够了,现在想想挺好笑的。 过去的探索 因为我用python,而rabbitmq比较贴合快速和复杂的数据处…...
golang time包和日期函数
1.简介 在程序中日期和时间是我们经常会用到的,在go中time包提供了时间的显示和测量函数。 2.获取当前时间 通过time.Now()函数获取当前时间对象,然后获取时间对象的年月日时分秒等值。 now : time.Now()fmt.Printf("now%v type%T\n", now…...
学习springboot 的自动配置原理
前言 为什么要学习springboot 的自动配置原理? 1学习 自定义成starter 的前提 实际开发中,我们如果定义公共的组件给团队使用,为了让他们使用方便就自定义成starter。而想要学习starter ,就要先了解springboot 的自动配置原理 2 面试需要 了…...
排错 -- FISCO BCOS区块链网络 -- 3. 编译智能合约
文章为FISCO BCOS2.0搭建区块链平台中发现的问题与总结,出错原因不唯一 ,解决办法不唯一 目前社区缺少完整,稳定的搭建平台和教程 ,欢迎各位及时补充,如有错误请及时评论纠正! 感谢各位搜索到这里&#…...
ffmpeg 添加毫秒时间戳
网上有好多添加时间水印的,默认是到秒,而我需要到毫秒,查了一下,没有找到更好的方案,下面是自己实现的方案,可以显示到毫秒。如果有更好的方案,欢迎讨论 ffmpeg -i video.mp4 -vf "drawte…...
centos7上安装Docker
文章目录 **1. 使用华为云镜像源替换Docker仓库****2. 安装Docker CE****3.更换docker镜像源-使用华为云的docker镜像源****4.补充:docker的使用****5.补充:删除docker的步骤** 1. 使用华为云镜像源替换Docker仓库 步骤: 删除无效的Docker仓…...
大模型推理后JSON数据后处理
大模型推理后JSON数据后处理 flyfish LLM 通常指的是 Large Language Model,也就是大语言模型,针对 JSON格式的输出,可以在大模型推理前、推理中、推理后进行处理,这里是在推理后进行处理。 针对模型输出结果,可采用结…...
【干货】Docker 在自动化测试和性能测试中的应用
引言 在现代软件测试领域,Docker 已经成为提升自动化测试和性能测试效率的重要工具。它不仅能提供一致的测试环境,还能大幅减少配置和维护成本。本文将深入探讨 Docker 在自动化测试和性能测试中的应用场景、优势及实践方案。 1. 为什么选择 Docker&am…...
【Linux内核系列】:文件系统收尾以及软硬链接详解
🔥 本文专栏:Linux 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录: 世界上只有一种个人英雄主义,那么就是面对生活的种种失败却依然热爱着生活 内容回顾 那么在之前的学习中,我们…...
视频理解之Actionclip(论文宏观解读)
配合解读代码解读 1.研究背景 1. 视频行为识别的重要性 视频行为识别是视频理解领域的核心任务之一,旨在通过分析视频内容来识别和分类其中的人物行为或活动。这一任务在多个领域具有重要的应用价值,例如智能监控、人机交互、自动驾驶、医疗健康等。随…...
java手机号、邮箱、日期正则表达式
Java正则核心API Java中用 java.util.regex 包的两个类: Pattern:编译正则表达式Matcher:执行匹配操作 1. 验证手机号 String regex "1[3-9]\\d{9}"; boolean isValid "18812345678".matches(regex); // true2. 提取…...
navicat16 升级到 navicat17 之后原来的连接找不到了 mac用户
版本16的路径 注意把对应的路径改成自己的用户名 /Users/自己的用户名/Library/Application Support/PremiumSoft CyberTech/Navicat CC/Common/Settings 版本17的路径 /Users/自己的用户名/Library/Containers/com.navicat.NavicatPremium/Data/Library/Application Suppor…...
Altium Designer——CHIP类元器件PCB封装绘制
文章目录 PCB封装组成元素:焊盘的属性 SS34肖特基二极管SMA(DO-214AC)封装绘制资料:步骤:1.绘制焊盘:用到的快捷键:资料: 2.绘制丝印:用到的快捷键:资料: PCB封装组成元素…...
[C++Qt] 槽函数收不到信号问题(信号的注册)
📢博客主页:https://loewen.blog.csdn.net📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢本文由 丶布布原创,首发于 CSDN,转载注明出处🙉📢现…...
【一起来学kubernetes】12、k8s中的Endpoint详解
一、Endpoint的定义与作用二、Endpoint的创建与管理三、Endpoint的查看与组成四、EndpointSlice五、Endpoint的使用场景六、Endpoint与Service的关系1、定义与功能2、创建与管理3、关系与交互4、使用场景与特点 七、Endpoint的kubectl命令1. 查看Endpoint2. 创建Endpoint3. 编辑…...
SpringBoot的并行SQL任务并完成所有任务之后返回操作
一、核心实现方案 1. 线程池配置与异步支持 通过 EnableAsync 启用异步支持,并自定义线程池避免默认线程池的性能问题: Configuration EnableAsync public class AsyncConfig {Beanpublic Executor taskExecutor() {ThreadPoolTaskExecutor executor …...
《AI浪潮中的璀璨新星:Meta Llama、Ollama与DeepSeek的深度剖析》:此文为AI自动生成
《AI浪潮中的璀璨新星:Meta Llama、Ollama与DeepSeek的深度剖析》:此文为AI自动生成 引言:AI 大模型的群雄逐鹿时代 在科技飞速发展的当下,AI 大模型领域已成为全球瞩目的焦点,竞争激烈程度堪称白热化。从 OpenAI 推出…...
LVGL移植到6818开发板
一、移植步骤 1.lv_config.h 配置文件启动 framebuffer 2、lv_config.h 配置文件关闭SDL 2.修改main.c 去掉SDL输入设备 3.修改Makefile 文件启动交叉编译 去掉警告参数 去掉SDL库 4.交叉编译代码 make clean #清空 ⭐ 必须要清空一次再编译! 因为修改了 lv_con…...
Spring Boot应用首次请求性能优化实战:从数据库连接池到JVM调优
目录 问题现象与背景分析性能瓶颈定位方法论数据库连接池深度优化Spring Bean生命周期调优JVM层性能预热策略全链路监控体系建设生产环境验证方案总结与扩展思考1. 问题现象与背景分析 1.1 典型问题场景 在某互联网金融项目的Spring Boot应用上线后,运维团队发现一个关键现象…...
UE4-UE5虚幻引擎,前置学习一--Console日志输出经常崩溃,有什么好的解决办法
有些差异 这么牛逼的引擎,居然有这种入门级别的问题,一触发清理,大概率(80%)会崩溃 无论虚幻5还是UE4都有这个问题,挺烦人的 实在忍不了了,这次,今天 就想问问有什么好的处理方法么?&#x…...
(全)2024下半年真题 系统架构设计师 综合知识 答案解析01
系统架构设计师第二版教程VIP课程https://edu.csdn.net/course/detail/40283 操作系统 下列选项中不能作为预防死锁措施的是 。 A. 破坏“循环等待"条件 B. 破坏“不可抢占”条件 C. 破坏“互斥”条件 D. 破坏“请求和保持”条件 答案:C 解析&…...
程序化广告行业(18/89):交易模式与关键概念解析
程序化广告行业(18/89):交易模式与关键概念解析 大家好呀!一直以来,我都在深入研究程序化广告这个充满挑战与机遇的领域,在学习过程中收获了很多,也迫不及待想和大家分享。写这篇博客ÿ…...
Linux系统之less命令的基本使用
Linux系统之less命令的基本使用 一、less命令介绍二、less命令的使用帮助2.1 less命令的帮助信息2.2 less命令主要选项解释 三、less命令的基本使用3.1 查看文件内容3.2 结合管道使用 四、注意事项 一、less命令介绍 在Linux和Unix类操作系统中,文件浏览是一项常见的…...
【微知】plantuml在泳道图中如何将多个泳道框起来分组并且设置颜色?(box “浏览器“ #LightGreen endbox)
泳道分组并且着色 分组用 box和endbox ,颜色用#xxx,标注用"xxx" box "浏览器" #LightGreen participant "浏览器1" as Browser participant "浏览器2" as Browser2 endboxparticipant "服务端" as …...
C#生产型企业ERP系统管理软件PCB行业ERP进销存MRP管理系统BOM管理
背景 本软件为为苏州某生产型电子科技企业开发的ERP管理软件。 功能说明 希哲管理系统v1.0是一款在流览器上使用的企业管理软件,使用上与客户端版的优势是: 1.安装更新部署方便,只需服务器部署了软件,其它客户端的用户无需安装&am…...
文件系统 linux ─── 第19课
前面博客讲解的是内存级文件管理,接下来介绍磁盘级文件管理 文件系统分为两部分 内存级文件系统 : OS加载进程 ,进程打开文件, OS为文件创建struct file 和文件描述符表 ,将进程与打开的文件相连, struct file 内还函数有指针表, 屏蔽了底层操作的差异,struct file中还有内核级…...
基于大模型预测的难治性青光眼诊疗方案研究报告
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测难治性青光眼的原理与方法 2.1 大模型介绍 2.2 数据收集与预处理 2.3 模型训练与优化 三、术前风险预测与准备 3.1 术前眼压及视神经损伤风险预测 3.2 患者全身状况评估 3.3 术前准备工作 四…...
射频前端模块(FEM)的基本原理与架构:从组成到WiFi路由器的应用
射频前端模块(FEM)的基本原理与架构:从组成到WiFi路由器的应用 一、FEM是什么? 射频前端模块(Front-End Module, FEM)是无线通信系统中负责处理射频信号的核心组件。它将多个关键电路集成在一个模块中,包括功率放大器(PA)、低噪声放大器(LNA)、射频开关(Switch)、…...
qemu分析之 KVM_EXIT_MMIO
基于qemu-2.8.1 address_space_rw 函数作用 这是QEMU内存子系统的核心函数,负责分块处理跨MemoryRegion的内存读取操作。主要场景包括: 处理跨越多个MemoryRegion的连续内存读取区分RAM直接访问与MMIO设备模拟处理不同位宽(1/2/4/8字节&am…...
k8s系统学习路径
学习 Kubernetes(K8s)需要循序渐进,结合理论知识和实践操作。以下是学习 Kubernetes 的推荐步骤: 1. 先决条件 • 掌握容器基础:先学习 Docker,理解容器化概念(镜像、容器、仓库)、…...
