写点什么

如何将 Redis 用于微服务通信的事件存储

  • 2019-12-09
  • 本文字数:1968 字

    阅读完需:约 6 分钟

如何将 Redis 用于微服务通信的事件存储

以我的经验,将某些应用拆分成更小的、松耦合的、可协同工作的独立逻辑业务服务会更易于构建和维护。这些服务(也被称为微服务)各自管理自己的技术栈,因此很容易独立于其他服务进行开发和部署。前人已经总结了很多关于使用这种架构设计的好处,在此我就不再赘述了。关于这种设计,有一个方面我一直在重点关注,因为如果没有它,将会导致一些有趣的挑战。


虽然构建松耦合的微服务是一个非常轻量级和快速的开发过程,但是这些服务之间共享状态、事件以及数据的通信模型却不那么简单。我使用过的最简单的通信模型就是服务间直接通信,但是这种模型被 Fernando Dogio 明确地证明一旦服务规模扩大就会失效,会导致服务崩溃、重载逻辑以及负载增加等问题,从而可能引起的巨大麻烦,因此应该尽量避免使用这种模型。还有一些其他通信模型,比如通用的发布/订阅模型、复杂的 kafka 事件流模型等,但是最近我在使用 Redis 构建微服务间的通信模型。

拯救者 Redis!

微服务通过网络边界发布状态,为了跟踪这种状态,事件通常需要被保存在事件存储中。由于事件通常是一种异步写入操作的不可变流的记录(又被称为事务日志),因此适用于以下场景:


  1. 顺序很重要(时间序列数据)

  2. 丢失一个事件会导致错误状态

  3. 回放状态在任何给定时间点都是已知的

  4. 写操作简单且快捷

  5. 读操作需要更多的时间,以至于需要缓存

  6. 需要高可扩展性,服务之间都是解耦的,没有关联


使用 Redis,我始终可以轻松实现发布-订阅模式。但现在,Redis 5.0 提供了新的 Streams 数据类型,我们可以以一种更加抽象的方式对日志数据结构进行建模-使之成为时间序列数据的理想用例(例如最多一次或最少一次传递语义的事务日志)。基于双主功能,轻松简单的部署以及内存中的超快速处理能力,Redis 流成为一种管理大规模微服务通信的必备工具。


基本的模型被称为命令查询职责分离(CQRS),它将命令和查询分开执行,命令使用 HTTP 协议,而查询采用 RESP(Redis 序列化协议)。


让我们使用一个例子来说明如何使用 Redis 作为事件存储。

OrderShop 简单应用概述

我创建了一个简单但是通用的电子商务应用作为例子。当创建/删除客户、库存物品或订单时,使用 RESP 将事件异步传递到 CRM 服务,以管理 OrderShop 与当前和潜在客户的互动。像许多常见应用程序的需求一样,CRM 服务可以在运行时启动和停止,而不会影响其他微服务。这需要捕获在其停机期间发送给它的所有消息以进行后续处理。


下图展示了 9 个解耦的微服务的互连性,这些微服务使用由 Redis 流构建的事件存储进行服务间通信。他们通过侦听事件存储(即 Redis 实例)中特定事件流上的任何新创建的事件来执行此操作。



图 1. OrderShop 架构


我们的 OrderShop 应用程序的域模型由以下 5 个实体组成:


  • 顾客

  • 产品

  • 库存

  • 订单

  • 账单


通过侦听域事件并保持实体缓存为最新状态,事件存储的聚合功能仅需调用一次或在响应时调用。



图 2. OrderShop 域模型

安装并运行 OrderShop

按照如下步骤安装并运行 OrderShop 应用:


  1. 从这里下载代码仓库:https://github.com/Redislabs-Solution-Architects/ordershop

  2. 确保已经安装了 Docker Engine 和 Docker Compose

  3. 安装 Python3:https://python-docs.readthedocs.io/en/latest/starting/install3/osx.html

  4. 使用 docker-compose up 启动应用程序

  5. 使用 pip3 install -r client / requirements.txt 安装需求

  6. 然后使用 python3 -m unittest client / client.py 执行客户端

  7. 使用 docker-compose stop crm-service 停止 CRM 服务

  8. 重新执行客户端,您会看到该应用程序正常运行,没有任何错误

深入了解

以下是来自 client.py 的一些简单测试用例,以及相应的 Redis 数据类型和键。



我选择流数据类型来保存这些事件,因为它们背后的抽象数据类型是事务日志,非常适合我们连续事件流的用例。我选择了不同的键来分配分区,并决定为每个流生成自己的条目 ID,ID 包含秒“-”微秒的时间戳(为了保持 ID 的唯一,并保留了键/分区之间事件的顺序)。


我选择集合来存储 ID(UUID),并选择列表和哈希来对数据建模,因为它反映了它们的结构,并且实体缓存只是域模型的简单投影。

结论

Redis 提供的各种数据结构-包括集合,有序集合,哈希,列表,字符串,位数组,HyperLogLogs,地理空间索引以及现在的流-可以轻松适应任何数据模型。流包含的元素不仅是单个字符串,而且是由字段和值组成的对象。范围查询速度很快,并且流中的每个条目都有一个 ID,这是一个逻辑偏移量。流提供了针对时间序列等应用的解决方案,并可为其他应用提供流消息,例如,替换需要更高可靠性的通用发布/ 订阅应用程序,以及其他全新的应用。


您可以通过分片(聚集多个实例)来扩展 Redis 实例并提供容灾恢复的持久性选项,所以 Redis 可以作为企业级应用的选择。


本文转载自公众号中间件小哥(ID:huawei_kevin)。


原文链接:


https://mp.weixin.qq.com/s/4uxNiETeGsQXdQfWIQGozQ


2019-12-09 16:512830

评论

发布
暂无评论
发现更多内容

AIIA杭州大会|李京梅:基于孟子GPT生成式大模型的技术与行业应用实践

澜舟孟子开源社区

架构经典设计思想之池化

三叶草

2023深圳高交会|第二十五届中国国际高新技术展览会

AIOTE智博会

高交会

「大模型之家」对话澜舟科技创始人兼CEO周明:马上采取行动,拥抱大模型

澜舟孟子开源社区

Nautilus Chain:主权模块化区块链的早期实践

BlockChain先知

快速玩转 Llama2!阿里云机器学习 PAI 推出最佳实践(一)——低代码 Lora 微调及部署

阿里云大数据AI技术

钛媒体专访|对话澜舟科技周明:大模型炒作过热,创业公司要选好赛道

澜舟孟子开源社区

iOS MachineLearning 系列(21)——CoreML模型的更多训练模板

珲少

低代码治好了CIO们的 “精神内耗”

高端章鱼哥

软件开发 低代码 数字化 软件交付 降低成本

澜舟科技成立两周年|“孟子GPT”大模型开启邀测

澜舟孟子开源社区

直播预告 | 博睿学院:揭开docker的神秘面纱

博睿数据

Docker 可观测性 智能运维 博睿数据 博睿学院

iOS MachineLearning 系列(22)——将其他三方模型转换成CoreML模型

珲少

网络安全(黑客)自学

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

低代码是开发者的未来吗?浅谈低代码平台

互联网工科生

云原生 低代码 数字化 系统开发

点云标注在自动驾驶中的精度提升

来自四九城儿

6大产品20项亮点,支付宝小程序云全揭秘

TRaaS

小程序 支付宝小程序

AIGC,你看我还有机会吗?| 融云前沿

融云 RongCloud

人工智能 产品 AI 互联网 AIGG

2023 年 10 大前端发展趋势

互联网工科生

前端 发展趋势

从零开始搭建医药领域知识图谱实现智能问答与分析服务(含码源):含Neo4j基于垂直网站数据的医药知识图谱构建、医药知识图谱的自动问答等

汀丶人工智能

人工智能 知识图谱 智能问答

软件测试/测试开发丨Python 封装 学习笔记

测试人

Python 软件测试 自动化测试 封装

压力测试核心性能指标及行业标准

优测云服务平台

压力测试 稳定性测试 并发测试 系统优化 #性能测试

软件测试/测试开发丨Python 继承 学习笔记

测试人

Python 程序员 软件测试 自动化测试

Flink 最佳实践:TDSQL Connector 的使用(上)

腾讯云大数据

flink 流计算 Oceanus

uni-app开发小程序:项目架构以及经验分享

陇锦

小程序 uni-app 前端

如何判断某个视频是深度伪造的?

高端章鱼哥

人工智能 伪造视频 AI视频

Hybrid App 技术解析:热更新的原理

Onegun

混合应用开发 native 热更新 Hybrid

金融领域:产业链知识图谱包括上市公司、行业和产品共3类实体,构建并形成了一个节点10w+,关系边16w的十万级别产业链图谱

汀丶人工智能

自然语言处理 知识图谱

基于 Databend 实现的海量日志实时查询服务 | 多点DMALL

Databend

如何将 Redis 用于微服务通信的事件存储
_文化 & 方法_中间件小哥_InfoQ精选文章