在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应用程序的高级图表,如果看起来有点混乱,我很抱歉,图形设计不是我最擅长的技能,但它应该可以帮助您了解组件及其交互。
行动起来
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
本文:
讨论:请加入知识星球或者微信圈子【首席架构师圈】
- 登录 发表评论
- 208 次浏览
最新内容
- 4 days 23 hours ago
- 6 days 21 hours ago
- 1 week ago
- 1 week 1 day ago
- 1 week 1 day ago
- 1 week 1 day ago
- 1 week 2 days ago
- 1 week 2 days ago
- 1 week 2 days ago
- 1 week 2 days ago