写点什么

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

评论

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

关于MySQL的一些骚操作——提升正确性

爱好编程进阶

Java 程序员 后端开发

借鉴这份Java进阶架构师之路的核心知识,我成功收获蚂蚁金服、阿里、美团等Offer

Java浪潮

Java 架构 java架构

运维审计堡垒机哪款好?报价贵吗?

行云管家

网络安全 堡垒机 IT运维 运维审计

阿联酋航空与华为进一步深化合作伙伴关系

最新动态

SpringCloud 中 Gateway 是如何关联对应的 GatewayFilterFactory 和 参数解析的

gin

Gateway SpringCould

不容忽视的35点代码优化细节

爱好编程进阶

Java 程序员 后端开发

再见了收费的Navicat!操作所有数据库有DBeaver就够了

爱好编程进阶

Java 程序员 后端开发

黄吉:如何适配OpenHarmony自有音频框架ADM?

OpenHarmony开发者

OpenHarmony

CRM系统的18个关键功能

低代码小观

CRM 客户关系管理 企业管理系统 CRM系统 客户关系管理系统

导师男团来袭 | 开源之夏2022,与Alluxio一起探索数据编排的奇妙世界

Alluxio

开源 大学生 #开源项目 开源之夏 数据编排

毕业总结

凌波微步

架构训练营

如何制作优秀的产品说明手册?

小炮

产品说明手册

深入浅出Redis丨阿里架构师的Redis实战心得,让你毫不费力的学习

Java浪潮

redis java程序员 java架构

互联网架构演变

爱好编程进阶

Java 程序员 后端开发

网络协议之:memcached binary protocol详解

程序那些事

Java 网络协议 程序那些事 5月月更

参与 Apache 顶级开源项目的 N 种方式,Apache Dubbo Samples SIG 成立!

爱好编程进阶

Java 程序员 后端开发

作为Java程序员连Redis都不会?阿里架构师带你深入“解剖”Redis

Java浪潮

redis JAVA开发 java程序员

分布式事务及其一致性协议

爱好编程进阶

Java 程序员 后端开发

字节面试到底有多难,一个Hadoop源码就拦住了百分之90的人群

爱好编程进阶

Java 程序员 后端开发

堡垒机是服务器吗?两者有区别吗?

行云管家

运维 网络安全 服务器 堡垒机

这么好用的低延时直播,网易云信竟然将它开源了?!

网易云信

开源 WebRTC 音视频技术

报告解读下载 | 5月《中国数据库行业分析报告》重磅发布!精彩抢先看!

墨天轮

数据库 oracle opengauss TiDB 国产数据库

Talent Plan TinyKV Project1 StandaloneKV

爱好编程进阶

Java 程序员 后端开发

一篇文章彻底学会BOM

爱好编程进阶

Java 程序员 后端开发

AI简报:Blind超分KernelGAN

AIWeker

人工智能 深度学习 机器视觉 5月月更 超分

原来,嵌入式BI方案的核心差异全在这,教你如何评估!

葡萄城技术团队

数据分析 BI 嵌入式软件 核心差异

[数据分析]-音频分析-BirdCLE-1

浩波的笔记

人工智能 AI 数据分析

手把手推导Back Propagation

OneFlow

人工智能 神经网络 深度学习 Back Propagation 推导过程

洞见科技纪凯:基于隐私计算的「客户增长」生态

洞见科技

金融科技 隐私计算

一文读懂架构整洁之道

爱好编程进阶

Java 程序员 后端开发

微服务网关除了zuul、spring cloud gateway还有更出色的

爱好编程进阶

Java 程序员 后端开发

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