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

使用 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 代理中发布时,第二个是尊重服务类。

相关文章:

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

发布-订阅消息系统在任何企业架构中都发挥着重要作用,因为它可以实现可靠的集成,而无需紧密耦合应用程序。在解耦的系统之间共享数据的能力并不是一个容易解决的问题。 考虑一家拥有多个使用不同语言和平台独立构建的应用程序的企业。它需要响应地共享数…...

valarray 包含对象成员的类(cpp14章)

C代码重用 1.公有继承可以实现 2.包含、私有继承、保护继承用于实现has-a关系,即新的类将包含另一个类的对象。 (使用这样类成员:本身是另外一个类对象称为包含 (组合或层次化)。) 3.函数模板、类模…...

2023双11笔记本电脑候选名单(截止2023.10.13的价格,双十一活动可能会更便宜一点)

以下是我最近几天查阅抖音,B站,知乎,百度,朋友后候选出来的一些6000-8000的游戏本电脑,标绿的属性是相比之下较为优秀的 附上几个网上的CPU和显卡排行网站 CPU性能排行榜 - CPU天梯图 - 最强CPU2023(较为全面的CPU排行,收录四千多款) 笔记本性能排行榜 - 快科技天梯榜 笔记本CP…...

Springcloud笔记(4)-客户端负载均衡Ribbon

Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,不需要独立部署,几乎存在于每一个springcloud构建的微服务和基础设施中。 微服务间调用,API网关的请求转发都通过Ribbon实现。 负载均衡 通常所说的负载均衡都是指的服务端负载均衡&#xf…...

MediaRecorder媒体录音机

权限&#xff1a; <uses-permission android:name"android.permission.RECORD_AUDIO"/> <uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name"android.permission.READ_EXTE…...

短视频如何批量添加水印

在当今的数字时代&#xff0c;短视频已经成为一种非常流行的内容形式。无论是社交媒体还是视频分享网站&#xff0c;短视频都已经成为了一种非常有吸引力的内容。然而&#xff0c;对于一些拥有大量视频内容的创作者来说&#xff0c;添加水印可能是一项繁琐的任务。本文将介绍如…...

RT-Thread MQTT(学习)

MQTT背景应用 MQTT是机器对机器&#xff08;M2M&#xff09;/物联网&#xff08;IoT&#xff09;连接协议&#xff0c;英文全名为“Message Queuing Telemetry Transport”&#xff0c;“消息队列遥测传输”协议。它是专为受限设备和低带宽、高延迟或不可靠的网络而设计的&…...

Vue_Bug VUE-ELEMENT-ADMIN默认是英文模式

Bug描述&#xff1a; VUE-ADMIN-TEMPLATE-MASTER VUE-ELEMENT-ADMIN-MASTER 两个项目直接从GitHub上拉取下来 默认是英文模式 其他信息&#xff1a; 这两个项目默认支持中文语言包&#xff0c;无需额外引入&#xff0c;只需删除英文语言包依赖 //import enLang from element-…...

Spark中的Driver、Executor、Stage、TaskSet、DAGScheduler等介绍

工作流程&#xff1a; Driver 创建 SparkSession 并将应用程序转化为执行计划&#xff0c;将作业划分为多个 Stage&#xff0c;并创建相应的 TaskSet。Driver 将 TaskSet 发送给 TaskScheduler 进行调度和执行。TaskScheduler 根据资源情况将任务分发给可用的 Executor 进程执…...

docker的资源限制参数设置错误,导致的clickhouse性能瓶颈

使用场景 我们使用docker作为服务的虚拟化工具&#xff0c;服务都部署在docker里我们使用docker-compose管理所有docker服务的配置文件针对某些服务&#xff0c;我们要限制这个docker占用的资源数量&#xff0c;例如&#xff0c;cpu和内存在进行配置时&#xff0c;网上搜了一些…...

Vue路由守卫有哪些,怎么设置,有哪些使用场景?

Vue 路由守卫是在 Vue Router 中提供的一种功能&#xff0c;它允许您在导航到某个路由前、路由变化时或导航离开某个路由时执行代码。Vue 路由守卫提供了以下几种类型&#xff1a; 1.全局前置守卫 router.beforeEach 在进入路由前执行的钩子函数&#xff0c;它会接收三个参数&a…...

云原生网关可观测性综合实践

作者&#xff1a;钰诚 可观测性 可观测性&#xff08;Observability&#xff09;是指系统、应用程序或服务的运行状态、性能和行为能够被有效地监测、理解和调试的能力。 随着系统架构从单体架构到集群架构再到微服务架构的演进&#xff0c;业务越来越庞大&#xff0c;也越来…...

vue-element-admin—登录页面添加自定义背景

一、效果图 初始效果&#xff1a; 更改背景后效果&#xff1a; 二、操作步骤 1、准备图片 2、更改代码 打开下面路径的 index.vue 文件&#xff1a; vue-element-admin-master\src\views\login\index.vue 也就是登录页面。 对 .login-container 样式代码块内代码做如下…...

软设上午题-错题知识点一

软设上午题-错题知识点一 1、ipconfig 显示信息&#xff1b; ipconfig /all 显示详细信息 &#xff0c;可查看DHCP服务是否已启用&#xff1b; ipconfig /renew 更新所有适配器&#xff1b; ipconfig /release 释放所有匹配的连接。 2、耦合性也叫块间联系。指软件系统结构中各…...

微信小程序(小程序入门)

一&#xff0c;介绍 1、什么是小程序 小程序是一种轻量级的应用程序&#xff0c;可以在移动设备上运行&#xff0c;不需要用户下载和安装。它们通常由企业或开发者开发&#xff0c;用于提供特定功能或服务。 微信小程序&#xff08;wei xin xiao cheng xu&#xff09;&#xf…...

虹科分享 | 想买车无忧?AR为您带来全新体验!

新能源汽车的蓬勃发展&#xff0c;推动着汽车行业加速进行数字化变革。据数据显示&#xff0c;全球新能源汽车销售额持续上升&#xff0c;预计到2025年&#xff0c;新能源汽车市场规模将达到约 4200亿美元&#xff0c;年复合增长率超过 30%。这表明消费者对清洁能源出行的需求不…...

easyUI重新渲染

问题 使用Easyui 时&#xff0c;动态后添加的元素样式无法生效。 解决颁发 全页面重新渲染 $.parser.parse();单一元素重新渲染 var obj $("#div1").append("<input classeasyui-textbox typetext>"); $.parser.parse(obj);...

html和css基础练习

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

Linux信号 signal()编程

在Linux的进程间通信中可以用signal&#xff08;&#xff09;函数进行信号与信息传递。 1.信号 信号的名字和编号&#xff1a; 每个信号都有一个名字和编号&#xff0c;这些名字都以“SIG”开头&#xff0c;例如“SIGIO ”、“SIGCHLD”等等。 信号定义在signal.h头文件中&am…...

【LeetCode】16.最接近的三数之和

1 问题 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target 1 输出&…...

FastbootEnhance 完整指南:Windows 上最友好的 Fastboot 工具箱与 Payload 提取器

FastbootEnhance 完整指南&#xff1a;Windows 上最友好的 Fastboot 工具箱与 Payload 提取器 【免费下载链接】FastbootEnhance A user-friendly Fastboot ToolBox & Payload Dumper for Windows 项目地址: https://gitcode.com/gh_mirrors/fa/FastbootEnhance 还在…...

LLM函数调用工程化:从基础概念到智能体框架设计实战

1. 项目概述&#xff1a;从“函数调用”到智能体交互的范式演进最近在GitHub上看到一个名为“SKY-lv/function-calling”的项目&#xff0c;这个标题乍一看平平无奇&#xff0c;甚至有些过于直白。但作为一名长期混迹在AI应用开发一线的工程师&#xff0c;我立刻嗅到了一丝不寻…...

音乐标签混乱的终结者:music-tag-web如何用3个步骤帮你重建完美音乐库

音乐标签混乱的终结者&#xff1a;music-tag-web如何用3个步骤帮你重建完美音乐库 【免费下载链接】music-tag-web 音乐标签编辑器&#xff0c;可编辑本地音乐文件的元数据&#xff08;Editable local music file metadata.&#xff09; 项目地址: https://gitcode.com/gh_mi…...

避开这3个坑,你的STM32F103+LoRa+阿里云项目才能跑得稳

STM32F103LoRa阿里云物联网项目稳定性优化实战指南 在物联网设备开发中&#xff0c;稳定性往往是区分业余原型与工业级产品的关键分水岭。许多开发者能够快速搭建起STM32F103与LoRa模块的基础通信框架&#xff0c;并实现阿里云物联网平台的数据上传&#xff0c;却在长期运行中频…...

如何快速实现文献元数据智能转换:Zotero插件终极指南

如何快速实现文献元数据智能转换&#xff1a;Zotero插件终极指南 【免费下载链接】zotero-format-metadata Linter for Zotero. A plugin for Zotero to format item metadata. Shortcut to set title rich text; set journal abbreviations, university places, and item lang…...

Xiaomusic终极指南:如何通过5个技术模块实现小爱音箱智能音乐播放

Xiaomusic终极指南&#xff1a;如何通过5个技术模块实现小爱音箱智能音乐播放 【免费下载链接】xiaomusic 使用小爱音箱播放音乐&#xff0c;音乐使用 yt-dlp 下载。 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaomusic 还在为传统音乐播放器的复杂操作和功能…...

终极Windows更新修复指南:用Reset-Windows-Update-Tool一键解决所有更新问题

终极Windows更新修复指南&#xff1a;用Reset-Windows-Update-Tool一键解决所有更新问题 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-…...

MATLAB图像处理实战:用形态学开闭运算5分钟搞定椒盐噪声去除

MATLAB图像处理实战&#xff1a;5分钟用形态学开闭运算高效去除椒盐噪声 在数字图像处理领域&#xff0c;椒盐噪声是最常见的干扰类型之一——那些随机分布在图像上的黑白噪点&#xff0c;就像撒在照片上的胡椒和盐粒。对于工程师和科研人员来说&#xff0c;如何快速有效地去除…...

HiveWE魔兽地图编辑器:5分钟快速上手指南,告别卡顿创作新时代

HiveWE魔兽地图编辑器&#xff1a;5分钟快速上手指南&#xff0c;告别卡顿创作新时代 【免费下载链接】HiveWE A Warcraft III world editor. 项目地址: https://gitcode.com/gh_mirrors/hi/HiveWE 还在为《魔兽争霸III》原版地图编辑器缓慢的加载速度和繁琐的操作而烦恼…...

Audacity音频编辑:从新手到专业创作者的免费音频处理方案

Audacity音频编辑&#xff1a;从新手到专业创作者的免费音频处理方案 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 你是否曾经想过编辑一段音频&#xff0c;却因为昂贵的软件而却步&#xff1f;或者想要录制播客…...