在优锐课学习中了解到,我们可以看到实施资源适配器以将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建立可靠的高性能分布式消息传递基础结构的更多相关文章

  1. Apache RocketMQ分布式消息传递和流数据平台及大厂面试宝典v4.9.2

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com 定义 Apache RocketMQ官网地址 https://rocketmq.apache.org/ Latest rel ...

  2. Kafka 消息队列系列之分布式消息队列Kafka

    介绍 ApacheKafka®是一个分布式流媒体平台.这到底是什么意思呢?我们认为流媒体平台具有三个关键功能:它可以让你发布和订阅记录流.在这方面,它类似于消​​息队列或企业消息传递系统.它允许您以容 ...

  3. 基于netty轻量的高性能分布式RPC服务框架forest<上篇>

    工作几年,用过不不少RPC框架,也算是读过一些RPC源码.之前也撸过几次RPC框架,但是不断的被自己否定,最近终于又撸了一个,希望能够不断迭代出自己喜欢的样子. 顺便也记录一下撸RPC的过程,一来作为 ...

  4. 基于netty轻量的高性能分布式RPC服务框架forest<下篇>

    基于netty轻量的高性能分布式RPC服务框架forest<上篇> 文章已经简单介绍了forest的快速入门,本文旨在介绍forest用户指南. 基本介绍 Forest是一套基于java开 ...

  5. .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务

    前面对于分布式事务也讲了好几篇了(可靠消息最终一致性 分布式事务 - TCC 分布式事务 - 2PC.3PC),但是还没有实战过.那么本篇我们就来演示下如何在 .NET 环境下实现一个基于可靠消息的分 ...

  6. 高性能分布式执行框架——Ray

    Ray是UC Berkeley AMP实验室新推出的高性能分布式执行框架,它使用了和传统分布式计算系统不一样的架构和对分布式计算的抽象方式,具有比Spark更优异的计算性能. Ray目前还处于实验室阶 ...

  7. 高可用高性能分布式文件系统FastDFS实践Java程序

    在前篇 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备 中已介绍搭建高可用的分布式文件系统架构. 那怎么在程序中调用,其实网上有很多栗子, ...

  8. 高性能分布式哈希表FastDHT

    高性能分布式哈希表FastDHT介绍及安装配置 FastDHT-高效分布式Hash系统 FastDHT(分布式hash系统)安装和与FastDFS整合实现自定义文件ID Centos6.3 停安装 F ...

  9. 高性能分布式锁-redisson

    RedLock算法-使用redis实现分布式锁服务 译自Redis官方文档 在多线程共享临界资源的场景下,分布式锁是一种非常重要的组件. 许多库使用不同的方式使用redis实现一个分布式锁管理. 其中 ...

随机推荐

  1. Redis安装部署以及简单应用

    Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(list ...

  2. QT Creator: The process could not be started!

    如果往工程里面增加了uac.manifest 文件后,QT creator不通过管理员启动的话,若要debug程序的话,就会提示 “The process could not be started!” ...

  3. ASCII码表收藏

    ASCII码表 ASCII码值 ESC键 VK_ESCAPE (27)回车键: VK_RETURN (13)TAB键: VK_TAB (9)Caps Lock键: VK_CAPITAL (20)Shi ...

  4. docker jenkins安装

    https://hub.docker.com/r/jenkins/jenkins jenkins的docker官方镜像地址 https://jenkins.io/ jenkins官方网站 环境: 阿里 ...

  5. Java连载55-接口的作用、接口举例

    一.接口的作用 1.可以使项目分层,所有层都面向接口开发,开发效率提高了. 2.接口使代码和代码之间的耦合度降低,就像内存条和主板的关系,变得“可插拔”,可以随意切换. ​总结:接口和抽象类能够完成某 ...

  6. Linux查看CPU和内存情况

    本文简单介绍在Linux上查看CPU和内存情况和一款系统资源查看工具htop. 查看CPU情况 以下是个人工作会经常使用到的服务器的信息. 查看所有CPU信息 可以通过如下命令查看所有CPU信息: # ...

  7. 使用opencv和numpy实现矩阵相乘和按元素相乘 matrix multiplication vs element-wise multiplication

    本文首发于个人博客https://kezunlin.me/post/1e37a6/,欢迎阅读最新内容! opencv and numpy matrix multiplication vs elemen ...

  8. C sharp #006# 委托与事件

    饮水思源:金老师的自学网站 索引 委托(Delegate) Click事件探究 委托(Delegate) “不学会委托(Delegate),等于没学.NET编程!” 例程1-委托类型变量 using ...

  9. JavPlayer:AI破坏马赛克,大量马赛克破坏版影片流出

    这是最近几个月业界讨论比较火的话题,发酵到现在, 终于可以给大家总结下最近的马赛克破坏版影片到底是怎么回事? 马赛克破坏版,简单讲就是利用AI技术,在打有马赛克影片的马赛克基础上进行修复操作, 来实现 ...

  10. maven修改运行环境配置

    maven中自带的tomcat是6版本,比如我们想用tomcat7,jdk1.8,我们就要通过配置来改变. 改变方式如下 <build> <plugins> <plugi ...