从零开始实现消息队列(二)

news/2024/2/27 20:43:50

从零开始实现消息队列

  • .
  • 核心API
  • 交换机类型
  • 持久化
  • 网络通信
    • Connection和Channel
  • 消息应答
  • 模块划分

.

在这里插入图片描述

核心API

对于Broker来说,要实现以下核心API,通过这些API来实现消息队列的基本功能.

  1. 创建队列(queueDeclare)
  2. 销毁队列(queueDelete)
  3. 创建交换机(exchangeDeclare)
  4. 销毁交换机(exchangeDelete)
  5. 创建绑定(queueBind)
  6. 解除绑定(queueUnbind)
  7. 发布消息(basicPublish)
  8. 订阅消息(basicConsume)
  9. 确认消息(basicAck)

Producer和Consumer则通过网络的方式,远程调用这些API,实现生产者消费者模型
对于RabbitMQ而言,VirtualHost也只是可以进创建和删除,但是我们这里就不实现了

交换机类型

对于 RabbitMQ而言,交换机有以下四种类型

  1. Direct,生产者发布消息时,直接指定被该交换机绑定的队列名
  2. Fanout,生产者发送的消息会被复制到该交换机上的所有队列中
  3. Topic,绑定队列到交换机上时,指定一个字符串为bindingKey,发送消息指定一个字符串为routingKey,当bindingKey和routingKey满足一定的匹配条件的时候,则把消息投递到指定队列中
  4. Header

其中header比较复杂,我们这里就不进行实现了,并且常见的也就只有前三种

持久化

Exchange,Queue,Binding,Message都有持久化需求,要保证程序重启和主机重启过后,上述内容不会丢失.

网络通信

生产者和消费者都是客户端,Broker是服务器,客户端和服务器之间是通过网络进行通信的,在网络通信的过程中,客户端部分要提供对应的API,来实现对服务器的操作

  1. 创建Connection
  2. 关闭Connection
  3. 创建Channel
  4. 关闭Channel
  5. 加上Broker服务器有的所有API

Connection和Channel

Connection对应一个TCP连接.
Channel则是Connection中的逻辑通道.
一个Connection中可以包含多个Channel.
Channel和Channel之间的数据是独立的,不会相互干扰
这样的设计是为了避免频繁的创建关闭TCP连接,达到长连接的效果

消息应答

被消费的消息,需要进行应答
应答模式分为两种:

  1. 自动应答:消费者只要消费了消息,就算应答完毕了,Broker就会直接删除这个消息
  2. 手动应答:消费者需要手动调用应答接口,Broker接收到了应答请求之后,才会对这个消息进行删除(可靠性更高)

模块划分

在这里插入图片描述


http://www.ppmy.cn/news/1350008.html

相关文章

QT学习文件操作类 QFile

(一)QFile QFile 是 Qt 框架中用于文件处理的一个类。它提供了读取和写入文件的功能,支持文本和二进制文件。QFile 继承自 QIODevice ,因此它可以像其他 IO 设备一样使用。 (1)主要功能 1. 文件读写…

学习记录691@spring面试之bean的作用域

Spring为Bean定义了5种作用域,分别为Singleton(单例)、Prototype(原型)、Request(请求级别)、Session(会话级别)和Global Session(全局会话)。 S…

mysql、mybatis中SORT

SORT排序 根据数据表sys_series中HOT(int类型)进行升序排列: 原来的数据库中存储: 排序 # 结果是HOT字段为null的所有数据都排在最前面,不为null的数据按升序排列 SELECT * FROM sys_series ORDER BY HOT;# 结果是H…

项目02《游戏-13-开发》Unity3D

基于 项目02《游戏-12-开发》Unity3D , 任务 :宠物系统 及 人物头像血条 首先在主面板MainPanel预制体中新建一个Panel, 命名为PlayerInfo 新建Image,作为头像 新建Slider,作为血条 对Panel组件添加一个水…

python从入门到精通(二十):python的exe程序打包制作

python的exe程序打包制作 python打包的概念python打包的模块导入模块安装验证基本语法命令参数文件夹模式单文件模式资源嵌入exe更改图标启动画面(闪屏)禁用异常提示 python打包的概念 将普通的*.py程序文件打包成exe文件。exe文件即可执行文件&#xf…

林浩然与杨凌云的Java世界奇遇记:垃圾回收大冒险

林浩然与杨凌云的Java世界奇遇记:垃圾回收大冒险 The Java Adventure Chronicles of Lin Haoran and Yang Lingyun: Garbage Collection Odyssey 在一个充满0和1代码森林的世界里,住着两位勇敢的程序员侠侣——林浩然和杨凌云。林浩然是个身怀Java绝技的…

[职场] 如何通过运营面试_1 #笔记#媒体#经验分享

如何通过运营面试 盈利是公司的事情,而用户就是你运营的事情。你需要彻底建立一个庞大而有效的用户群,这样才能让你们的公司想盈利就盈利,想战略就战略,想融资就融资。 一般从事运营的人有着强大的自信心,后台数据分析…

Ainx-V0.2-简单的连接封装与业务绑定

📕作者简介: 过去日记,致力于Java、GoLang,Rust等多种编程语言,热爱技术,喜欢游戏的博主。 📗本文收录于Ainx系列,大家有兴趣的可以看一看 📘相关专栏Rust初阶教程、go语言基础系列…

爬爬今天爬小说————爬虫练习

爬不同的的小说,会有略微的改动。 我今天这个是从一章的提前到全部的提前。 在我们电脑里面了,想怎么看就怎么看。 代码代码: import re import requestsheaders {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x6…

Java图形化界面编程——弹球游戏 笔记

Java也可用于开发一些动画。所谓动画,就是间隔一定的时间(通常小于0 . 1秒 )重新绘制新的图像,两次绘制的图像之间差异较小,肉眼看起来就成了所谓的动画 。 ​ 为了实现间隔一定的时间就重新调用组件的 repaint()方法,可以借助于…

【每日一题】牛客网——链表分割

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

设计模式-状态模式 State

状态模式 一、简介概述二、有限状态机1、分支法2、查表法3、状态模式 三、重点回顾 一、简介概述 状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。 状态设计模式是一种行为型设计模式,它允许对象在其内部状态发生变化…

【Kubernetes】kubectl top pod 异常?

目录 前言一、表象二、解决方法1、导入镜像包2、编辑yaml文件3、解决问题 三、优化改造1.修改配置文件2.检查api-server服务是否正常3.测试验证 总结 前言 各位老铁大家好,好久不见,卑微涛目前从事kubernetes相关容器工作,感兴趣的小伙伴相互…

Tdesign 常用知识

Mock数据中的常见随机数: mock 数据中, 开头的是 Mock.js 的语法。Mock.js 是一个用于生成随机数据的库,它提供了一些特殊的语法,可以方便地生成各种类型的随机数据。 在这个 mock 数据中,使用了以下语法&#xff1a…

blender怎么保存窗口布局,怎么设置默认输出文件夹

进行窗口布局大家都会,按照自己喜好来就行了,设置输出文件夹如图 这些其实都简单。关键问题在于,自己调好了窗口布局,或者设置好了输出文件夹之后,怎么能让blender下次启动的时候呈现出自己设置好的窗口布局&#xff…

【doghead】uv_loop_t的创建及线程执行

worker测试程序,类似mediasoup对uv的使用,是one loop per thread 。创建一个UVLoop 就可以创建一个uv_loop_t Transport 创建一个: 试验配置创建一个: UvLoop 封装了libuv的uv_loop_t ,作为共享指针提供 对uv_loop_t 创建并初始化

中科大计网学习记录笔记(九):DNS

前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…

【每日一题】LeetCode——反转链表

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

假如程序员也分等级……

本次考试有10道题,一题10分,做完后可查看段位等级。 1.请问复制粘贴用什么快捷键? A.CtrlV,CtrlC B.CtrlC,CtrlV 2.计算机里用的是( )进制? A.二 B.十 3.对于输出“Hello world”正确的一项是&#…

ChatGPT高效提问—prompt常见用法(续篇八)

ChatGPT高效提问—prompt常见用法(续篇八) 1.1 对抗 ​ 对抗是一个重要主题,深入探讨了大型语言模型(LLM)的安全风险。它不仅反映了人们对LLM可能出现的风险和安全问题的理解,而且能够帮助我们识别这些潜在的风险,并通过切实可行的技术手段来规避。 ​ 截至目前,网络…
最新文章