使用Kafka建立可靠的高性能分布式消息传递基础结构

Posted youruike1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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建立可靠的高性能分布式消息传递基础结构的主要内容,如果未能解决你的问题,请参考以下文章

Kafka八股文梳理

分布式系统消息中间件——RabbitMQ的使用基础篇

消息队列应用场景解析

初识中间件Kafka

主流消息中间件优劣:ActiveMQ,RabbitMQ,Kafka,RocketMQ

kafka初步学习