使用Kafka建立可靠的高性能分布式消息传递基础结构
在优锐课学习中了解到,我们可以看到实施资源适配器以将Kafka与企业Java解决方案集成。码了很多专业的相关知识, 分享给大家参考学习。
由于世界已经变得移动化,因此应用程序现在必须实时提供数据。 不仅重要的是存储在数据库表中的最终结果,而且重要的是用户在使用应用程序时执行的所有操作。 无论可用的任何信息(例如用户点击,日志数据或传感器数据)用于增强用户体验,生成报告,为机器学习系统供稿,等等。 今天,开发人员必须专注于基于实时事件流的系统。
下图显示了基于事件流处理的体系结构示例。

Apache Kafka已将其自身确立为构建高度可扩展的基于事件的系统首选解决方案。Kafka为事件流平台提供了快速发展的功能,开发人员可以在现代业务解决方案中使用它。但是,开发人员经常需要将基于IBM MQ或IBM WebSphere Application Platform之类的技术现有Java EE业务解决方案集成到这些新的事件流体系结构中。
考虑这个例子。一家在线商店拥有一个移动应用程序,该应用程序使用Kafka将付款请求数据发送到以Enterprise Java实现的分布式付款系统。该解决方案必须绝对保证一次完整的付款请求处理过程(避免向买方收取多次费用)。 但是,在分布式系统中不可避免发生故障,因此该解决方案需要妥善处理故障。
1、使用Apache Kafka实现消息传递
Apache Kafka是用于事件流处理的分布式系统,广泛用于微服务架构和基于云的环境中。它提供消息传递,存储和事件处理,所有这些都在同一平台内。
下图显示了Apache Kafka组件的基本拓扑,包括通过Kafka集群基础结构交换消息的生产者和消费者。

尽管Kafka有很多优势,但Kafka仍在努力解决以下问题:
- 在消息处理失败的情况下进行手动补偿的逻辑,这可能导致消息无法处理
- 不支持XA事务处理
- 确保在消费者应用程序中进行一次准确的交付处理
- 将其集成到企业解决方案中的额外开发和可维护性工作
要解决Kafka集成问题,你可以应用传统的消息传递拓扑概念,例如事务日志,恢复日志和XA事务。你可以实现基于Java EE连接器体系结构(JCA)的资源适配器。使用此JCA资源适配器,可以为应用程序服务器提供ACID功能,以进行Kafka消息处理。然后,此JCA资源适配器提供了与Enterprise Java应用程序的无缝Kafka集成。
2、实施JCA资源管理员
Java EE连接器体系结构定义了一组可伸缩,安全和事务机制。 你可以将JCA资源适配器安装到任何符合Java EE的应用程序服务器中,例如IBM Websphere Application Server,IBM Business Process Manager,JBoss,WebSphere Liberty,Glassfish或Weblogic。
Java EE连接器体系结构规范还提供了一组标准合同,这些合同允许企业应用程序和企业信息系统(例如Kafka)之间进行通信。JCA资源适配器可以插入应用程序服务器,并通过照顾所有系统级机制(事务,连接管理,崩溃恢复,错误跟踪和日志记录)来启用Kafka集成。JCA资源适配器将从需要与之集成的企业应用程序中隐藏所有Kafka通信逻辑。通过实现JCA资源适配器,企业应用程序提供商可以专注于实现业务和表示逻辑,而不是与Kafka集成相关的底层逻辑。因此,JCA资源适配器仅需开发一次,即可被不同的应用程序重用。
通过查看下图显示设计的解决方案系统上下文,将其与我们的在线商店付款方案相关联。

移动应用程序将付款请求数据发送到Kafka,后者通过Kafka资源适配器与付款企业应用程序集成在一起。此外,还使用适配器将付款通知发送到Kafka。 适配器启动XA事务,该事务将传播到支付企业应用程序以及通知系统。因此,与付款请求处理相关的所有任务将在同一全局事务中运行,并且一起完成或失败。该设计除了要读取或写入数据的主题外,还需要在Kafka上设置重试,死信和事务日志主题。
现在,让我们更详细地探讨从移动应用程序发送和发送到移动应用程序的消息的处理。
3、入站流
在我们的支付方案中,入站流程是指由在线商店移动应用程序发起的通信,该通信将支付请求数据发送到Kafka。资源适配器提供Kafka连接,并异步将消息传递到应用程序服务器上存在的消息端点。这可以使用JCA规范定义的消息流入合同来实现。
Kafka JCA资源适配器使用一组用于端点激活配置的配置属性来实现激活规范JavaBean。这些配置详细信息定义为应用程序服务器配置的一部分。
资源适配器会定期轮询入站Kafka主题的一批付款请求。成功轮询数据后,它将遍历数据批次,并异步将消息传递到终结点实例。 每个消息端点可能存在多个端点实例,这使并发消息消耗并提供高吞吐量。
Kafka消费者补偿是在安排消息传递之后立即提交的,以避免批次阻塞的问题。 这种设计是可行的,因为资源适配器通过需要在Kafka上设置重试,死信和事务日志主题来实现故障转移过程。在我们的例子中,端点需要支持XA事务,并且需要在向端点发送数据之前创建事务上下文,从而提供原子消息消耗。

如果事务将被应用程序服务器中止,则应回滚端点实例完成的所有工作,并将消息转发给Kafka重试主题。
适配器使用来自Kafka重试主题的消息并对其进行重新处理。在超过配置的重试次数以处理消息之后,适配器会将消息转移到Kafka死信主题。
由于发送到空头邮件主题的消息包含有价值的业务数据,因此监视主题非常重要。
4、出站流量
出站流是指由企业应用程序启动的Kafka通信。在我们的情况下,这是用于将付款确认发送到移动应用程序的通知系统。JCA规范定义了一个连接管理协定,该协定使应用程序服务器能够池化Kafka连接,从而提供了可支持大量客户端的可扩展环境。
Kafka出站连接配置详细信息是使用Managed Connection Factory JavaBean定义的。使用这些配置详细信息,适配器使管理员和开发人员可以配置Kafka生产者并决定功能,例如可靠性,可用性,吞吐量,延迟和事务支持。这些配置详细信息定义为应用程序服务器配置的一部分。
Kafka JCA资源适配器公开了实现CCI(通用客户端接口)和JMS(Java Message Service)接口的Kafka连接工厂和Kafka连接。应用程序组件使用JNDI(Java命名和目录接口)名称查找连接工厂。成功获取工厂后,应用程序将其用于获取访问Kafka的连接。因此,您可以为通知系统应用程序无缝添加Kafka集成,该集成当前将数据发送到IBM MQ或Active MQ之类的JMS消息传递提供程序。
资源适配器出站流封装了底层的Kafka通信逻辑,并提供以下内容:
- 连接池
- 使用Kafka交易机制仅保证一次交货
- 准确的识别,记录和处理Kafka故障
- 实现XA事务,因此在分布式系统中使用Kafka提供可靠的消息处理。
为了管理出站流中的事务,Kafka资源适配器使用JCA规范定义的事务管理协定。

在我们的情况下,需要将连接工厂设置为支持XA事务,并且当客户端获得连接时,适配器需要启动Kafka事务。如果应用服务器在任何时候回滚该事务,则将终止Kafka事务。在发生XA事务提交的情况下,事务管理器跨参与运行的事务的所有资源执行两阶段提交协议。这样可以保证对托管资源的所有读/写访问都完全落实或回退。
最后,资源适配器通过将事务数据写入Kafka事务日志主题来跟踪正在运行的事务。 写入事务日志主题的数据用于崩溃恢复处理,该崩溃恢复处理在分布式系统中提供可靠的消息处理。
5结论
设计Kafka JCA适配器的方法提供了与标准企业Java解决方案的Kafka事件处理平台的“即插即用” JMS集成。该设计使你可以将Kafka与现有企业应用程序无缝集成,而无需实施补偿逻辑。该适配器还使应用程序服务器能够为企业应用程序所依赖的Kafka连接性和事务管理提供基础结构和运行时环境。
文章写道这里,如有不足之处,欢迎补充~
使用Kafka建立可靠的高性能分布式消息传递基础结构的更多相关文章
- Apache RocketMQ分布式消息传递和流数据平台及大厂面试宝典v4.9.2
概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Apache RocketMQ官网地址 https://rocketmq.apache.org/ Latest rel ...
- Kafka 消息队列系列之分布式消息队列Kafka
介绍 ApacheKafka®是一个分布式流媒体平台.这到底是什么意思呢?我们认为流媒体平台具有三个关键功能:它可以让你发布和订阅记录流.在这方面,它类似于消息队列或企业消息传递系统.它允许您以容 ...
- 基于netty轻量的高性能分布式RPC服务框架forest<上篇>
工作几年,用过不不少RPC框架,也算是读过一些RPC源码.之前也撸过几次RPC框架,但是不断的被自己否定,最近终于又撸了一个,希望能够不断迭代出自己喜欢的样子. 顺便也记录一下撸RPC的过程,一来作为 ...
- 基于netty轻量的高性能分布式RPC服务框架forest<下篇>
基于netty轻量的高性能分布式RPC服务框架forest<上篇> 文章已经简单介绍了forest的快速入门,本文旨在介绍forest用户指南. 基本介绍 Forest是一套基于java开 ...
- .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务
前面对于分布式事务也讲了好几篇了(可靠消息最终一致性 分布式事务 - TCC 分布式事务 - 2PC.3PC),但是还没有实战过.那么本篇我们就来演示下如何在 .NET 环境下实现一个基于可靠消息的分 ...
- 高性能分布式执行框架——Ray
Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...
- 高可用高性能分布式文件系统FastDFS实践Java程序
在前篇 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备 中已介绍搭建高可用的分布式文件系统架构. 那怎么在程序中调用,其实网上有很多栗子, ...
- 高性能分布式哈希表FastDHT
高性能分布式哈希表FastDHT介绍及安装配置 FastDHT-高效分布式Hash系统 FastDHT(分布式hash系统)安装和与FastDFS整合实现自定义文件ID Centos6.3 停安装 F ...
- 高性能分布式锁-redisson
RedLock算法-使用redis实现分布式锁服务 译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件. 许多库使用不同的方式使用redis实现一个分布式锁管理. 其中 ...
随机推荐
- COUNT(*)、COUNT(主键)、COUNT(1)
MyISAM引擎,记录数是结构的一部分,已存cache在内存中; InnoDB引擎,需要重新计算,id是主键的话,会加快扫描速度: 所以select count(*) MyISAM完胜! MyISA ...
- Python网络爬虫_Scrapy框架_1.新建项目
在Pycharm中新建一个基于Scrapy框架的爬虫项目(Scrapy库已经导入) 在终端中输入: ''itcast.cn''是为爬虫限定爬取范围 创建完成后的目录 将生成的itcast.py文件移动 ...
- [洛谷P4942][题解]小凯的数字
这题打着高精的旗号其实是闹着玩的……(我不是题目) 数据范围就是提示你这题O(1)的 我们知道,一个数膜9的余数等于它数字和膜9的余数 我们可以把l到r加起来然后膜9 也就是(l+r)(r-l+1)/ ...
- .net core 在 Docker 上的部署
Docker可以说是现在微服务,DevOps的基础,咱们.Net Core自然也得上Docker..Net Core发布到Docker容器的教程网上也有不少,但是今天还是想来写一写.你搜.Net co ...
- Git原理入门解析
前言: 之前听过公司大佬分享过 Git 原理之后就想来自己总结一下,最近一忙起来就拖得久了,本来想塞更多的干货,但是不喜欢拖太久,所以先出一版足够入门的: 一.Git 简介 Git 是当前流行的分布式 ...
- css 揭秘-读书笔记
css 揭秘 [希]Lea verou 著 css 魔法 译 该书涵盖7大主题,47个css技巧,是css进阶必备书籍,开阔思路,探寻更优雅的解决方案.这本书完全用css渲染出的html写成的(布局. ...
- Android Fragment 隐藏或显示时调用的生命周期方法
Fragment使用方式大体分两种: 大家要注意不同的Fragment使用方法,Fragment隐藏和显示调用的生命周期方法是不同的,以下是Fragment显示隐藏调用的方法: //判断是否展示—与V ...
- linux中网络配置
一.查看ip ipconfig 二.png 测试主机之间网络连通 ping 目标ip #测试当前服务器是否可以连接目的主机 三.linux配置网络环境 vim /etc/sysconfig/netwo ...
- Specify Action Settings 指定按钮设置
In this lesson, you will learn how to modify Action properties. The ClearTasks Action will be used. ...
- 剑指offer笔记面试题14----剪绳子
题目:给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,n > 1 并且m > 1),每段绳子的长度记为k[0], k[1], ...k[m].请问k[0] x k[1] x .. ...