029-从零搭建微服务-消息队列(一)

写在最前

如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。

源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心

源码地址(前端):mingyue-ui: 🎉 基于 Vue3 + TS + Vite + Element plus 等技术,适配 MingYue 后台微服务

文档地址:Wiki - Gitee.com

消息队列

消息队列(Message Queue)是一种用于在分布式系统中进行异步通信的通信模式和技术。它允许不同的组件或服务之间通过发送和接收消息来进行通信,而无需直接耦合它们的实现细节。消息队列通常用于解耦系统的不同部分,提高系统的可伸缩性、可靠性和灵活性。

以下是消息队列的一些关键特点和概念:

  1. 消息生产者(Producer): 这是向消息队列发送消息的组件或应用程序。生产者将消息发送到队列中,通常包括一些有关消息内容的元数据。

  2. 消息队列(Queue): 这是用于存储消息的中间件组件,消息在这里排队等待被处理。消息队列通常支持不同的消息传递模式,例如先进先出(FIFO)或发布/订阅模式。

  3. 消息消费者(Consumer): 这是从消息队列接收消息并进行处理的组件或应用程序。消费者订阅特定队列,并在有新消息可用时接收并处理它们。

  4. 消息代理(Message Broker): 这是协调消息的发送和接收的中间件服务。消息代理通常负责消息的路由、传递和确保消息的可靠性。

  5. 消息确认(Acknowledgment): 消费者在成功处理消息后,通常会向消息队列发送确认,以告知队列消息已被处理。这确保了消息不会被重复处理。

  6. 消息持久性(Message Durability): 消息队列通常支持消息的持久性,这意味着即使在消息被传递给消费者之后,消息仍然会在系统中存储,以确保不会丢失。

  7. 消息超时(Message Timeout): 有时候,消息队列会设置消息的超时时间,以确保消息在一定时间内被处理,否则可能会被认为是过期消息。

  8. 发布/订阅模式(Publish/Subscribe): 这是一种消息传递模式,其中生产者将消息发布到一个主题(topic),而不是特定的队列,然后多个消费者订阅该主题以接收消息。这种模式支持广播消息。

使用场景

  • 异步通信:允许不同的系统组件异步通信,提高系统的响应性能。

  • 解耦组件:降低系统中不同组件之间的耦合,使得系统更容易维护和扩展。

  • 负载均衡:通过分发消息给多个消费者来平衡工作负载。

  • 消息传递可靠性:确保消息的可靠传递,即使在系统中的故障情况下也能保证不丢失消息。

  • 日志和审计:用于记录和审计系统活动,以便后续分析和故障排除。

技术选型

一些常见的消息队列实现包括 RabbitMQ、RocketMQ、Kafka等,选择适合特定应用场景的消息队列是关键,因为它会影响系统的性能、可靠性和可扩展性。不同的场景可能更适合不同的消息队列系统。

基础对比
RabbitMQRocketMQKafka
推出时间2007年2012年2012年
所属Pivotal开源,Mozilla阿里开源,ApacheLinkin开源,Apache
社区活跃度
开发语言ErlangJavaScala、Java
支持的协议AMQP自己定义一套自行定义一套(基于TCP)
吞吐量万级(5.95w/s)十万级(11.6w/s)十万级(17.3w/s)
topic数量对吞吐量的影响topic达到几百,几千个时,吞吐量会有较小幅度的下降topic达到几十,几百个时,吞吐量会大幅度下降
时效性微秒级毫秒级毫秒级
可用性高(主从架构)非常高(分布式架构)非常高(分布式架构)
使用场景适用于各种规模的应用程序,尤其适合需要多语言支持的场景。适用于大规模的企业应用和互联网场景,尤其在阿里巴巴等大型公司中得到广泛应用。适用于大数据处理、实时数据流分析、事件溯源等高吞吐量场景。
功能对比
RabbitMQRocketMQKafka
延迟队列
死信队列
优先级队列
消息回溯
消焦持久化
消魚确认机制单条OffsetOffset
消息TTL
消息重复支持at least once、at most once支持at least once支持at least once、at most once
消息顺序性消费者加锁分区有序
消息事务
消息过滤
消息查询
消息重新消费
消费模式队列模式广播模式+集群模式流模式
消费推拉模式Pull、PushPull、PushPull
批量发送

选型总结

通过对RabbitMQ、RocketMQ、Kafka 基础与功能两个维度对比,本项目将采用 RocketMQ、Kafka 两个消息队列。

RocketMQ 适用场景

  • 高性能、高可用性的消息传递场景,例如实时数据分析、电商秒杀等。

  • 需要强大的消息过滤和消息追踪功能的场景,例如广告投放、用户推送等。

  • 需要分布式事务支持的场景,RocketMQ提供了分布式事务消息特性。

Kafka 适用场景

  • 需要高吞吐量和低延迟的实时数据处理场景,例如用户行为日志分析、实时监控等。

  • 需要保留大量历史数据并支持数据回溯的场景,例如大数据分析、数据仓库等。

  • 需要构建事件驱动架构的场景,Kafka可以作为事件源和消息总线。

Docker 安装 RocketMQ

创建目录结构

具体内容可以参考:mingyue/docker/rocketmq

rocketmq/broker1/confbroker.conf/logsREADME.md/storeREADME.md/namesrv/logsREADME.md
docker-compose.yml

编写 docker-compose rocketmq 服务

version: '3.8'
services:mingyue-mqnamesrv:image: apache/rocketmq:4.9.4container_name: mingyue-mqnamesrvports:- "9876:9876"environment:JAVA_OPT: -server -Xms512m -Xmx512mcommand: sh mqnamesrvvolumes:- ./rocketmq/namesrv/logs:/home/rocketmq/logs/rocketmqlogs
​mingyue-mqbroker1:image: apache/rocketmq:4.9.4container_name: mingyue-mqbroker1ports:- "10911:10911"- "10909:10909"- "10912:10912"environment:JAVA_OPT_EXT: -server -Xms512M -Xmx512M -Xmn256mcommand: sh mqbroker -c /home/rocketmq/rocketmq-4.9.4/conf/broker.confdepends_on:- mingyue-mqnamesrvvolumes:- ./rocketmq/broker1/conf/broker.conf:/home/rocketmq/rocketmq-4.9.4/conf/broker.conf- ./rocketmq/broker1/logs:/home/rocketmq/logs/rocketmqlogs- ./rocketmq/broker1/store:/home/rocketmq/store
​mingyue-mqconsole:image: styletang/rocketmq-console-ngcontainer_name: mingyue-mqconsoleports:- "19876:19876"links:- mingyue-mqnamesrv:mqnamesrv #可以用mqnamesrv这个域名访问rocketmq服务environment:JAVA_OPTS: -Dserver.port=19876 -Drocketmq.namesrv.addr=mqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=falsedepends_on:- mingyue-mqnamesrv

启动测试

启动前先执行部分目录赋予读写权限,例:chmod 777 /docker/rocketmq/broker1/logs

访问 mingyue-mqconsole 可以打开 Dashboard 页面即可:http://ip:19876/#/

Docker 安装 Kafka

创建目录结构

具体内容可以参考:mingyue/docker/kafka

kafka/dataREADME.md
docker-compose.yml

编写 docker-compose kafka 服务

version: '3.8'
services:mingyue-zookeeper:image: 'bitnami/zookeeper:3.8.0'container_name: mingyue-zookeeperports:- "2181:2181"environment:TZ: Asia/ShanghaiALLOW_ANONYMOUS_LOGIN: "yes"ZOO_SERVER_ID: 1ZOO_PORT_NUMBER: 2181# 自带的控制台 一般用不上可自行开启ZOO_ENABLE_ADMIN_SERVER: "no"# 自带控制台的端口ZOO_ADMIN_SERVER_PORT_NUMBER: 8080
​mingyue-kafka:image: 'bitnami/kafka:3.2.0'container_name: mingyue-kafkaports:- "9092:9092"environment:TZ: Asia/Shanghai# 更多变量 查看文档 https://github.com/bitnami/bitnami-docker-kafka/blob/master/README.mdKAFKA_BROKER_ID: 1# 监听端口KAFKA_CFG_LISTENERS: PLAINTEXT://:9092# 实际访问ip 本地用 127 内网用 192 外网用 外网ipKAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://宿主机IP:9092KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181ALLOW_PLAINTEXT_LISTENER: "yes"volumes:- /docker/kafka/data:/bitnami/kafka/datadepends_on:- mingyue-zookeeperlinks:- mingyue-zookeeper:zookeeper #可以用zookeeper这个域名访问zookeeper服务
​mingyue-kafka-manager:image: sheepkiller/kafka-manager:latestcontainer_name: mingyue-kafka-managerports:- "19092:19092"environment:ZK_HOSTS: mingyue-zookeeper:2181APPLICATION_SECRET: letmeinKAFKA_MANAGER_USERNAME: mingyueKAFKA_MANAGER_PASSWORD: mingyue123KM_ARGS: -Dhttp.port=19092depends_on:- mingyue-kafkalinks:- mingyue-zookeeper:zookeeper #可以用zookeeper这个域名访问zookeeper服务

启动测试

启动前先执行部分目录赋予读写权限,例:chmod 777 /docker/kafka/data`

访问 mingyue-kafka-manager 可以打开 Clusters 页面即可:http://mingyue-mq:19092/

Spring Cloud Stream

Spring Cloud Stream 是一个用于构建与共享消息系统连接的高度可扩展的事件驱动微服务的框架。该框架提供了一个基于已经建立和熟悉的 Spring 成语和最佳实践的灵活编程模型,包括支持持久的 pub/sub 语义、消费者组和有状态分区。

说人话:Spring Cloud Stream 是 Spring 用来整合各种 MQ 中间件的框架。

Spring Cloud Stream的核心构建块

  • Destination Binders(目标绑定器):目标指的是 Kafka 还是 RabbitMQ,绑定器就是封装了目标中间件的包。如果操作的是 kafka 就使用 kafka binder ,如果操作的是 RabbitMQ 就使用 rabbitmq binder。

  • Destination Bindings(目标绑定):MQ 中间件与最终用户提供的应用程序代码(生产者/消费者)之间的桥梁,提供消息的“生产者”和“消费者”(由目标绑定器创建)

  • Message(消息):一种规范化的数据结构,生产者和消费者基于这个数据结构通过外部消息系统与目标绑定器和其他应用程序通信。

Spring Cloud Stream 架构图

Spring Cloud Stream 应用程序由中间件中立的核心组成。该应用程序通过在外部代理暴露的目的地和代码中的输入/输出参数之间建立绑定,与外部世界进行通信。建立绑定所需的经纪人特定细节由特定于中间件的 Binder 实现处理。

  • Middleware:消息中间件,如RabbitMQ、Kafka、RocketMQ等。

  • Binder:可以认为是适配器,用来将Stream与中间件连接起来,不同的Binder对应不同的中间件,需要我们配置。

  • Application:由Stream封装的消息机制,很少自定义开发。

  • Inputs:输入,可以自定义开发。

  • Outputs:输出,可以自定义开发。

小结

本节介绍了什么是消息队列、以及选择什么样的消息队列,如何对比,最终选择了 Kafka 与 RocketMQ。然后给出了 Docker 一件部署 Kafka 与 RocketMQ 的 docker-compose 脚本。阐述了什么是 Spring Cloud Stream,未来将会使用 Spring Cloud Stream 作为 MQ 中间价的框架。

下面我们就使用 Spring Cloud Stream 来搭建代码与 MQ 之间的桥梁~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147387.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ARP和DDOS攻击防御介绍

ARP攻击如何产生的? ARP如何进行有效的防御? ARP地址解析协议 已知对方ip地址,求得对方mac地址 交换机会自动学习: 当pc1想访问外网,会向外发一个广播包,交换机会收到一个广播包 ARP地址表: …

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石②

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石② 第十九章 驱动程序基石②19.3 异步通知19.3.1 适用场景19.3.2 使用流程19.3.3 驱动编程19.3.4 应用编程19.3.5 现场编程19.3.6 上机编程19.3.7 异步通知机制内核代码详解 19.4 阻塞与非阻塞19.4.1 应用编程19.4.2 驱动编程…

简历项目优化关键方法论-START

START方法论是非常著名的面试法则,经常被面试官使用的工具 Situation:情况、事情、项目需求是在什么情况下发生Task:任务,你负责的做的是什么Action:动作,针对这样的情况分析,你采用了什么行动方式Result:结果,在这样…

nodejs+vue流浪猫狗救助领养elementui

第三章 系统分析 10 3.1需求分析 10 3.2可行性分析 10 3.2.1技术可行性:技术背景 10 3.2.2经济可行性 11 3.2.3操作可行性: 11 3.3性能分析 11 3.4系统操作流程 12 3.4.1管理员登录流程 12 3.4.2信息添加流程 12 3.4.3信息删除流程 13 第四章 系统设计与…

XDM,10.1

XDM,今天是国庆,就没有其他啥事情,祝大家国庆节快乐,玩的开心。 这两天放假也有时间捣鼓自己的事情了,挺开心的,第一件事就是把自己的一个小开发板修好了,然后自己的小os也能跑了几个假的线程。…

Monkey测试

一:测试环境搭建 1:下载android-sdk_r24.4.1-windows 2:下载Java 3:配置环境变量:关于怎么配置环境变量(百度一下:monkey环境搭建,) 二:monkey测试&#xff1…

UG\NX二次开发 信息窗口的一些操作 NXOpen/ListingWindow

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 信息窗口的一些操作 NXOpen/ListingWindow 效果: 代码: #include "me.hpp" #include <NXOpen/ListingWindow.hxx> #include <…

基于 QT 实现 Task Timer,高效利用时间

一、开发环境 Ubuntu 20.04 QT6.0 二、新建 Qt Wigets Application 这里的基类选择 Wigets&#xff0c; pro 配置文件添加 sql 模块&#xff0c;需要用到 sqlite&#xff0c; QT sql 三、添加数据库连接头文件 // connection.h #ifndef CONNECTION_H #define CONNECTION_…

ImportSelector使用详解

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl ImportSelector概述 利用Import和ImportSelector可将组件批量添加至IoC容器 ImportSelector案例 在此&#xff0c;介绍ImportSelector使用案例。 定义ImportSelector S…

react create-react-app v5 从零搭建(使用 npm run eject)

前言&#xff1a; 好久没用 create-react-app做项目了&#xff0c;这次为了个h5项目&#xff0c;就几个页面&#xff0c;决定自己搭建一个&#xff08;ps:mmp 好久没用&#xff0c;搭建的时候遇到一堆问题&#xff09;。 我之前都是使用 umi 。后台管理系统的项目 使用 antd-…

Ubuntu20 QT6.0 编译 ODBC 驱动

一、新建测试项目 新建一个控制台项目&#xff0c; // main.cpp #include <QCoreApplication> #include <QSqlDatabase> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 获取当前Qt支持的驱动列表QStringList driv…

数据结构与算法----递归

1、迷宫回溯问题 package com.yhb.code.datastructer.recursion&#xffe5;5;public class MiGong {public static void main(String[] args) {// 先创建一个二维数组&#xff0c;模拟迷宫// 地图int[][] map new int[8][7];// 使用1 表示墙// 上下全部置为1for (int i 0; i…

毛玻璃动画交互效果

效果展示 页面结构组成 从上述的效果展示页面结构来看&#xff0c;页面布局都是比较简单的&#xff0c;只是元素的动画交互比较麻烦。 第一个动画交互是两个圆相互交错来回运动。第二个动画交互是三角绕着圆进行 360 度旋转。 CSS 知识点 animationanimation-delay绝对定位…

Golang语法、技巧和窍门

Golang简介 命令式语言静态类型语法标记类似于C&#xff08;但括号较少且没有分号&#xff09;&#xff0c;结构类似Oberon-2编译为本机代码&#xff08;没有JVM&#xff09;没有类&#xff0c;但有带有方法的结构接口没有实现继承。不过有type嵌入。函数是一等公民函数可以返…

解决仪器掉线备忘

网络管控越来越严格&#xff0c;老的Mac模式连接的仪器经常断开&#xff0c;要么是网络没活动被断开TCP了&#xff0c;要么是网络波动无法保持TCP。每次重启仪器控制很麻烦&#xff0c;基于之前用M写http服务的基础上改进仪器接口连接。 参照之前实现http服务的逻辑 最终逻辑 …

如何解决版本不兼容Jar包冲突问题

如何解决版本不兼容Jar包冲突问题 引言 “老婆”和“妈妈”同时掉进水里&#xff0c;先救谁&#xff1f; 常言道&#xff1a;编码五分钟&#xff0c;解冲突两小时。作为Java开发来说&#xff0c;第一眼见到ClassNotFoundException、 NoSuchMethodException这些异常来说&…

VRRP配置案例(路由走向分析,端口切换)

以下配置图为例 PC1的配置 acsw下行为access口&#xff0c;上行为trunk口&#xff0c; 将g0/0/3划分到vlan100中 <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]sysname acsw [acsw] Sep 11 2023 18:15:48-08:00 acsw DS/4/DATASYNC_CFGCHANGE:O…

再次总结nios II 下载程序到板子上时出现 Downloading RLF Process failed的问题

之前也写过两篇关于NIOS II 出现&#xff1a;Downloading RLF Process failed的问题&#xff0c;但是总结都不是很全面&#xff0c;小梅哥的教程总结的比较全面特此记录。 问题&#xff1a;nios II 下载程序到板子上时出现 Downloading RLF Process failed的问题。 即当nios中…

《Jetpack Compose从入门到实战》 第二章 了解常用UI组件

目录 常用的基础组件文字组件图片组件按钮组件选择器组件对话框组件进度条组件 常用的布局组件布局Scaffold脚手架 列表 书附代码 Google的图标库 常用的基础组件 文字组件 Composable fun TestText() {Column(modifier Modifier.verticalScroll(state rememberScrollState…

Ubuntu20.04.1编译qt6.5.3版mysql驱动

下载qtbase6.5.3源码&#xff0c;将plugin中sqldrivers源码拷至于项目工程中&#xff0c;使用qtcreator打开文件 1、下载mysql开发库 sudo apt-get update sudo apt-get install build-essential libmysqlclient-dev 2、在msyql子目录中CMakeLists.txt第一行添加头文件、引…