跳转到主要内容
Chinese, Simplified

在Kafka系列事件驱动微服务的上一篇文章(参见此处)中,我展示了如何将异步事件驱动通信从Kafka一直扩展到通过Java后端的Web前端。

在处理资金转账的概念证明应用程序中,一个Kafka主题用于接收传入的转账消息,另一个主题用于存储帐户余额状态(不需要数据库)和广播更改(即,将通知从后端推送到前端)。

第一个主题(称为“transfers”)和第二个主题(称为“account-balances”)通过卡夫卡流连接。

Uber Cadence

在这篇文章中,我们将把Uber Cadence引入到mix中,以管理应用程序的状态(即保持帐户余额的更新),因此,Cadence取代了Kafka Streams。

Cadence是一个编排/工作流引擎,与其他大多数工作流引擎(如Zeebe、Camunda和许多其他引擎)不同,它不依赖于BPMN(或任何其他类型的XML)来定义工作流。

它使用常规编程语言,如Go和Java,这是一个巨大的优势,正如Cadence的首席开发人员在这篇评论中雄辩地解释的那样。

提供详细的描述或介绍Cadence不在本文的范围内,我们鼓励您进行自己的(即使是肤浅的)研究,并观看本篇文章的配套视频,但我将提到它的主要优点:

  • 它使您的应用程序易于扩展
  • 它极大地简化了错误处理
  • 它带有一个管理Web UI和CLI

简而言之,它处理了分布式应用程序固有的大部分繁重工作。

 

增强的PoC应用程序

让我们浏览一下数据流,了解一下应用程序的功能。

一个名为 Cadence transfers recording service 的新服务监听关于Kafka主题的传入传输消息。

如果消息表示打开新帐户的行为,则服务将使用相应的Cadence Java客户端API方法创建新 workflow 。

Cadence服务器将把新工作流的执行分配给先前启动的Cadence工作线程之一。需要注意的一个重要细节是,工作流的id与帐户id匹配,即每个帐户有一个工作流

如果传入的Kafka消息表示更改现有帐户余额的资金转移,则Cadence transfers记录服务将调用工作流中id与帐户id匹配的必需方法(必须用@SignalMethod注释)。

这将触发在其中一个Cadence worker上远程执行代码,在根据需要更新帐户余额的值之后,该worker将向“account-balances”主题发送Kafka消息以宣布事件。

接下来,“transfers websockets”服务将从“account-balances”Kafka主题中提取该消息,并通过websockets将其广播给感兴趣的角度Web客户端。

除了这种异步/推送通信之外,Angular 客户端还可以同步查询“transfers websockets”服务,以获取帐户的当前余额或历史记录(即,该帐户的传输列表)。

为了满足这些请求,“transfers websockets”服务将通过调用必须用@query method注释的相应方法来查询Cadence服务器。

图表

这是PoC应用程序的高级图表,如果看起来有点混乱,我很抱歉,图形设计不是我最擅长的技能,但它应该可以帮助您了解组件及其交互。

Alt Text

 

行动起来

 

Source code repositories

https://github.com/VictorGil/cadence_transfers_recording_service
https://github.com/VictorGil/account_balance_workflow_api
https://github.com/VictorGil/transfers_websockets_service
https://github.com/VictorGil/transfers_frontend
https://github.com/VictorGil/transfers_recording_service
https://github.com/VictorGil/transfers_api
https://github.com/VictorGil/kafka_util

原文:https://dev.to/victorgil/kafka-cadence-websockets-angular-managing-event-driven-microservices-state-with-uber-cadence-1edc

本文:

讨论:请加入知识星球或者微信圈子【首席架构师圈】

Tags
 
Article
知识星球
 
微信公众号
 
视频号