使用 Apache Kafka 进行发布-订阅通信中的微服务

发布-订阅消息系统在任何企业架构中都发挥着重要作用,因为它可以实现可靠的集成,而无需紧密耦合应用程序。在解耦的系统之间共享数据的能力并不是一个容易解决的问题。

考虑一家拥有多个使用不同语言和平台独立构建的应用程序的企业。它需要响应地共享数据和流程。我们可以使用消息传递来实现这一点,以使用可定制的格式频繁、立即、可靠和异步地传输数据包。异步消息传递从根本上来说是对分布式系统问题的务实反应。发送消息不需要两个系统同时启动并准备就绪。

发布订阅通道

从简单的角度来看,对该模式的理解依赖于它对观察者模式的扩展,添加了用于通信事件通知的事件通道的概念。观察者模式描述了将观察者与其主题解耦的需求,以便主题可以轻松地向所有感兴趣的观察者提供事件通知,无论有多少观察者。

每个订阅者需要被通知一次特定事件,但不应该被重复通知同一事件。在通知所有订阅者之前,不能将事件视为已消耗。一旦所有订阅者都收到通知,该事件就可以被视为已消耗,并且应该从通道中消失 [2]。

代理、队列、主题和订阅

代理消息传递支持真正时间解耦系统的场景,其中消息生产者或消费者的可用性无法得到保证。对于代理消息传递,队列是保留由生产者创建的消息的代理,并且消费者可以在准备好时检索消息。

队列提供了最简单的消息传递选项。Queue 中的消息按先进先出(FIFO)组织,每条消息预计由单个消费者处理;然而,主题和订阅构成了发布/订阅模式,允许 N 个消费者处理同一消息。

发布订阅消息系统

发布订阅消息系统

可以将单个消息添加到主题,并且对于满足的每个订阅规则,消息的副本将添加到该订阅。在这种情况下,每个订阅都成为队列,消费者可以在队列中单独处理订阅上的消息。

Apache Kafka 是行业领导者正在使用的可靠且成熟的项目之一,它为我们提供了每秒处理大量消息的能力,而不是传统的消息系统,后者在传统场景中非常有用,但效率不高且价值不高在处理大数据场景时。

除了消息传递之外,Apache Kafka 还可以应用于流处理、网站活动跟踪、日志聚合、指标、基于时间的消息存储、提交日志和事件源。

卡夫卡和动物园管理员

Kafka 是一个分布式发布-订阅消息系统,其设计、分区和复制提交日志服务本质上是快速、可扩展和分布式的。它与传统消息系统的不同之处在于非常容易横向扩展,提供高吞吐量,支持多订阅者,在故障期间自动平衡消费者,并且能够允许实时应用程序或ETL将其用作批量消费磁盘上持久化消息的数量 [1]。

ZooKeeper用于管理和协调Kafka代理。每个 Kafka 代理都使用 ZooKeeper 与其他 Kafka 代理进行协调。ZooKeeper 服务会向生产者和消费者通知 Kafka 系统中新代理的存在或代理的故障。根据 Zookeeper 收到的有关代理存在或失败的通知,生产者和消费者做出决定并开始与其他代理协调他们的工作。此外,它还负责为分区选择新的领导者。

案例分析

在掌握了一些技术之后,让我们专注于练习。因此,我们的案例研究模拟了在发布-订阅上下文中使用 Spring Boot 微框架 v2.1.8.RELEASE 构建的两个微服务之间的通信,使用 Apache Kafka 2.3.1 作为消息系统。为了验证我们的研究,我们将设置和执行集成测试,重点是使用 JUnit 4/5 测试框架在端到端场景中集成应用程序的不同层。

发布订阅消息系统

Producer API 是一个实现业务实体服务操作的模块,以协调和统一与企业、机构和实体组相关的经济信息。Consumer API 是同一解决方案中的另一个模块,旨在集中所有业务实体统计数据,接收来自不同来源的数据输入。

为了简单起见,API 使用 H2 内存数据库。项目结构由三个模块组成。生产者和消费者这两个主要模块都依赖于 Common 模块,该模块与系统的其余部分共享错误处理和辅助类等内容。

让我们开始吧。

Spring Kafka 与 Apache Kafka 消息系统集成

Spring for Apache Kafka 项目将 Spring 的核心概念应用于基于 Kafka 的消息传递解决方案的开发。它提供了一个“模板”作为发送消息的高级抽象。它还通过 @KafkaListener注释 和“侦听器容器”为消息驱动的 POJO 提供支持。这些库提倡使用依赖注入和声明式 [3]。

生产者API

我们需要两个步骤来配置生产者。第一个是配置类,我们在其中定义生产者Map对象、生产者工厂和Kafka模板。当我们将消息构建器设置为在 Kafka 代理中发布时,第二个是尊重服务类。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

frp隧道(流量代理)

代理 代理使用场景 拿下远程web服务器webshell连接不稳定,需要使用稳定的木马程序远程服务器无法直接连接攻击者电脑(内网IP)需要借助公网vps转发来自失陷服务器的木马流量借助frp服务器(vps)和客户端(内…

MOS管经常被烧坏,多半是这些原因

MOS管,即金属氧化物半导体场效应管,是电子电路中常见的重要元件,因此很多电子工程师会选择在电路板上使用MOS管,但在使用过程中经常会遇见MOS管莫名被烧毁的问题,这些问题是如何造成的?如何解决&#xff1f…

彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)

彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK) Chapter1 (彻底解决Qt中文乱码以及汉字编码的问题(UTF-8/GBK)一、Qt Creator环境设置二、编码知识科普Qt常见的两种编码是:UTF-8和GBK 三、编码转换四、QString显示中文乱码的原…

香港服务器在大陆连不上怎么回事?

众所周知,香港服务器与中国内地的网络连通性是比较好的,不仅是机房地理距离的加持,还有就是利用CN2 GIABGP高速线路,参考恒创科技香港服务器访问内地网站,无需绕国际线路转换再到大陆,访问速度会比较快。但…

【交叉编译】tslib库交叉编译

tslib 是一个捕捉触屏事件的工具。qt 库在交叉编译的时候,提供了 -tslib 选项,使用该选项需要提前对 tslib 库进行交叉编译。 目录 1、源码下载 2、安装依赖 3、创建编译脚本 4、开始编译 1、源码下载 tslib 源码下载地址: https://github.com/lib…

《动手学深度学习 Pytorch版》 8.4 循环神经网络

8.4.1 无隐状态的神经网络 对于无隐藏装态的神经网络来说,给定一个小批量样本 X ∈ R n d \boldsymbol{X}\in\mathbb{R}^{n\times d} X∈Rnd,则隐藏层的输出 H ∈ R n h \boldsymbol{H}\in\mathbb{R}^{n\times h} H∈Rnh 通过下式计算: …

html和css基础练习

vscode快捷键 alt b 在浏览器中打开 alt shift b 在其他浏览器打开 ctrl / 注释 ctrl y 快捷键删除 参考文章 https://www.bilibili.com/video/BV1m84y1w7Tb 基础html标签 img:图像,title:头部文字,body:主…

格式工厂怎么把两个视频合并在一起

免费的工具谁不喜欢呢,今天为大家介绍的是格式工厂这款多功能视频转换软件,然而今天主要为大家介绍的是格式工厂的视频合并功能。 是的,你没有听错,格式工厂除了转换之外,还可以视频合适、视频剪辑、视频分割、去水印…

linux 安装python django pip 遇到的问题

Python解决SSL不可用问题 解决方案: 首先要明白python版本需要和openssl的版本需要相对匹配的,在Python3.7之后的版本,依赖的openssl,必须要是1.1或者1.0.2之后的版本,或者安装了2.6.4之后的libressl,linux…

实验室超声波清洗器的频率越高越好?

实验室超声波清洗器是一种新型的清洗设备,为实验室的高清洁度需求而开发。可实现各种试验玻璃容器和精密设备的自动清洗,处理传统人工清洗费时费力、效果难以控制的缺点,避免科研人员暴露在有害的清洗试剂中,改善实验室清洗环境。…

Meta开源数字水印Stable Signature,极大增强生成式AI安全

全球社交、科技巨头Meta(Facebook、Instagram等母公司)在官网宣布,开源数字水印产品Stable Signature,并公开论文。 据悉,Stable Signature是由Meta和INRIA(法国国家信息与自动化研究所)联合开…

“一馆一策”保亚运,精准气象服务背后的数据魔法

第十九届杭州亚运会已隆重闭幕,十五个比赛日留下了无数精彩的瞬间:开幕式数字火炬手点燃主火炬、男女100米接力赛的激情澎湃、“时间孤勇者”丘索维金娜的坚持、围棋选手柯洁的泪洒赛场…… 作为亚洲水平最高的综合型运动会,本届杭州亚运会竞…

选实验室超声波清洗机易忽视的内容?小型清洗机的优点有?

实验室超声波清洗机如今在行业内占据着重要的一席之地,摒弃了传统模式,坚持以超声波为主的清洗方式,在市场中获得的反响强烈。服务好,有诚信的实验室超声波清洗机能够消除客户的后顾之忧,工作人员会以真诚态度向客户提…

UGUI交互组件Slider

一.Slider对象的结构 对象介绍Slider附加Slider组件Background背景Fill Area填充范围Fill填充对象Handle Slider Area滑块移动范围Handle滑块 二.Slider组件属性 属性说明Fill Rect关联填充对象Handle Rect关联滑块对象Direction设置方向Min Value最大取值Max Value最小取值Wh…

1600*C. Game On Leaves(博弈游戏树)

Problem - 1363C - Codeforces 解析: 我们将目标结点 x 当作树的根,显然,到当 x 的度为 1 的时候,此时行动的人胜利。 我们假设现在的情况为,只剩余三个点,再选择任意一个点,则对方获胜。但是两…

Unity角色或摄像机移动和旋转的控制脚本

该脚本挂载到需要被移动、旋转控制的物体身上,也可以之间挂在到摄像机上! 挂载到摄像机上可以实现第一人称视角控制! 挂载到物体身上,配合摄像机跟踪脚本可以实现,第三人称视角控制! 第一人称视角 将角…

【Nuget】程序包源

程序包源地址(部分) Azure 中国区的官方 NuGet 程序包源地址 https://nuget.cdn.azure.cn/v3/index.json 官方 NuGet 程序包源地址 V2 https://www.nuget.org/api/v2 官方 NuGet 程序包源地址 V3 https://api.nuget.org/v3/index.json MyGet 上 Eto.Forms 框架的程序包源地址 h…

BUUCTF jarvisoj_level0 1

目录 一、分析二、EXP三、本地打不通?远程能打通? 一、分析 查看文件信息 关键信息 64位程序栈不可执行 IDA64反汇编 进入第一个函数 栈溢出 shift F12查找字符串 点进去 发现是一个后门函数 二、EXP from pwn import *context.arch amd64 #…

uni-app : 生成三位随机数、自定义全局变量、自定义全局函数、传参、多参数返回值

核心代码 function generateRandomNumber() {const min 100;const max 999;// 生成 min 到 max 之间的随机整数// Math.random() 函数返回一个大于等于 0 且小于 1 的随机浮点数。通过将其乘以 (max - min 1),我们得到一个大于等于 0 且小于等于 (max - min 1…

【肌电信号】OpenSignals使用方法 --- 肌电信号采集及导入matlab

一、 多通道采集教学 1. 数据线连接 将PLUX设备通过USB或蓝牙与电脑连接,注意确认在几号通道接线。 2.实时数据采集可视化 进行设置。需要在软件中选择你的PLUX设备,并配置相关的参数,如采样率、分辨率、信号类型等 3 支持数据回放和…