AICon 北京站 Keynote 亮点揭秘,想了解 Agent 智能体来就对了! 了解详情
写点什么

如何将 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:512995

评论

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

从原理聊JVM(一):染色标记和垃圾回收算法

京东科技开发者

Java JVM 三色标记 垃圾回收器 企业号 4 月 PK 榜

校企共建|阿里云与重庆大学人才培养交流会顺利举行

云布道师

阿里云

右键助手:MouseBoost PRO mac激活版

真大的脸盆

Mac Mac 软件 鼠标增强工具 鼠标辅助软件

大厂面试难?对标大厂“Java系统性能优化实战”二面阿里轻松搞定

Java你猿哥

面试 性能优化 SSM框架 Java性能优化

MySQL的varchar字段最大长度真的是65535吗?

Java你猿哥

MySQL 后端 SSM框架 varchar

全栈开发实战|​人事管理系统的设计与实现(Spring Boot + Vue 3 + MyBatis)

TiAmo

Spring Boot mybatis Vue 3 全栈开发 三周年连更

企业微信接入系列-上传附件资源

六月的雨在InfoQ

企业微信 三周年连更 企业微信接入 企微上传附件

行业分析| 新的学习方式——在线自习室

anyRTC开发者

音视频 在线教育 视频直播 直播连麦 在线自习室

微服务 Spring Boot 整合Redis分布式锁 实现优惠卷秒杀 一人一单

Bug终结者

redis 底层原理 三周年连更

css实现瀑布流效果

格斗家不爱在外太空沉思

CSS 三周年连更

求你看完再去面试!涨薪必备分布式事务小抄,狂怼面试官

程序知音

Java 分布式 后端 java架构 Java进阶

某程序员:被裁了要求公司足额补缴全部公积金,一次补二十多万!

Java你猿哥

Java 程序员 SSM框架

搭建一站式OpenHarmony设备开发Windows开发环境。

坚果

OpenHarmony 三周年连更

解决90%的面试!GitHub新兴“java面试手册 2023” 一网打尽BAT大厂

Java你猿哥

Java MySQL Spring Boot JVM MySQL面试

【4.14-4.21】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

《一文带你看懂:如何进行一次高质量CR》

后台技术汇

代码评审 三周年连更

海通证券与易观千帆达成合作,构建优质客户生态圈

易观分析

金融 证券 经济

第二届中国国际软件发展大会|华为:构筑坚实软件根基,赋能数字经济高质量发展

极客天地

破防了!阿里用17个真实企业级项目阐述Java系统分析与架构设计

Java你猿哥

微服务架构 架构设计 Java系统性能 Redis开发与运维 MySQl部署

Spring Boot如何使用Undertow容器?超级详细,建议收藏

bug菌

Spring Boot 三周年连更 Undertow

从原理聊JVM(一):染色标记和垃圾回收算法

小小怪下士

Java 程序员 后端 JVM

Android事件分发-基础原理和场景分析

京东科技开发者

android Activity View 企业号 4 月 PK 榜 ViewGroup

和 if else说再见,SpringBoot 这样做参数校验才足够优雅!

Java你猿哥

Java spring Spring Boot ssm if-else

震撼!阿里架构师全新产出Java面试突击宝典。Github标星疯涨!

Java你猿哥

spring Spring Boot JVM mybatis java面试

直播预告 | 时序数据处理的云端利器:TDengine Cloud 详解与演示

TDengine

tdengine 时序数据库 云服务

什么是前端开发领域的 Cumulative Layout Shift 问题

汪子熙

typescript 前端开发 angular web socket 三周年连更

Spring Boot过滤器实现项目内接口过滤

Java你猿哥

Java Spring Boot SSM框架

DataEase 对接明道云展示表格应用数据

搞大屏的小北

数据可视化 明道云 对接api 展示明道云

中移链合约常用开发介绍(三)工程化开发智能合约

BSN研习社

有没有那么一瞬间,你也曾有过“失业焦虑”呢?| 社区征文

架构精进之路

技术创新 职业发展 三周年征文 三周年连更

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