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

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

从零开始实现消息队列

  • .
  • 核心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.kler.cn/news/234826.html

相关文章:

  • 【XR806开发板试用】轻松连上华为云实现物联网
  • PLC在物联网中位置—承上启下,与上位机下位机的关联。
  • PyCharm2023.3.2配置conda环境
  • 【数据结构与算法】【腾讯阿里链表面试题】算法题--链表易懂版讲解
  • Debezium发布历史123
  • Java语言体系
  • 《动手学深度学习(PyTorch版)》笔记8.5
  • 【UE 游戏编程基础知识】
  • YOLOv5独家改进:上采样算子 | 超轻量高效动态上采样DySample,效果秒杀CAFFE,助力小目标检测
  • CSS Selector—选择方法,和html自动——异步社区的爬取(动态网页)——爬虫(get和post的区别)
  • 算法------(11)并查集
  • UVA11021 Tribles
  • 腾讯云4核8G服务器价格,性能如何?
  • Linux操作系统基础(九):Linux用户与权限
  • 字符串的解码--leetcode 394
  • .NET Core 3 foreach中取索引index
  • 《动手学深度学习(PyTorch版)》笔记7.3
  • 【Linux技术宝典】Linux入门:揭开Linux的神秘面纱
  • Python requests模块 快速入门 这篇就够了
  • 中国电子学会2019年12月份青少年软件编程Scratch图形化等级考试试卷三级真题(选择题、判断题)
  • 导入jar包的办法,若Maven报日志错误,Cannnot resolve XXXXX.jar
  • Springboot+vue的社区养老服务平台(有报告)。Javaee项目,springboot vue前后端分离项目
  • leetcode——滑动窗口题目汇总
  • python中的数组和list的异同
  • C语言之随心所欲打印三角形,金字塔,菱形(倒金字塔)
  • Go语言每日一练——链表篇(五)
  • Spring Cloud Hystrix 参数配置、简单使用、DashBoard
  • vim 启用鼠标复制粘贴
  • LeetCode Python - 9.回文数
  • IP地址如何保护网络安全