caching - 微服务规模架构中不同系统数据变化更新中央缓存
问题描述
我们正在构建一个微服务系统,新数据可以来自三个(或更多)不同的来源,并最终影响最终用户。
这个问题的系统目的是什么并不重要,所以我真的会尽量让它简单。请看附图。
数据可以来自以下来源:
- 后台站点:定义系统和用户配置。
- 主站点:用户与站点交互并执行操作的位置。
- 外部来源数据:例如可以提供有关用户的附加数据(补充信息)的合作伙伴。
这些服务是:
- 站点后台服务:为后台站点服务。
- 用户服务:服务于主站点。
- 导入服务:从外部来源导入附加数据(补充信息)。
- 用户缓存服务:与上述所有系统数据同步,并将它们组合成预先准备好的缓存响应。这样做的原因是因为主站点应该为数亿用户提供服务,并且应该以非常低的延迟工作。
主要思想是:
- 每个微服务都有自己的数据库。
- 每个微服务都可以扩展。
- 三个部分之一的每个数据更改都会影响用户,并应发送到缓存服务,以便最终反映在主站点上。
- 缓存 (Redis) 将所有数据组合到主站点的预先准备好的响应中。
- 每个服务数据更改都将发布到 pubsub 主题,以便缓存服务更新 Redis 数据库。
- 该系统应为大约 2 亿用户提供服务。
所以......问题是:。
解决方案
我将尝试解决您的一些观点,如果我误解了您的要求,请告诉我。
1)我相信你在问如何强制消息排序,旧的更新不会覆盖新的更新。消息的“publish_time”字段(https://cloud.google.com/pubsub/docs/reference/rpc/google.pubsub.v1#google.pubsub.v1.PubsubMessage)根据云发布订阅的时间进行协调服务器收到您的发布请求。如果您希望基于其他时间或排序机制进行协调,您可以向您的 PubsubMessage 或有效负载添加一个属性来执行此操作。
2)这似乎是一个普遍的同步问题,不一定与云发布订阅有关;我会把这个留给其他人来回答。
3)云数据流实现了类似于您所描述的窗口和水印机制。也许您可以使用它来删除冲突更新并在将它们写入后备存储之前执行预处理。 https://beam.apache.org/documentation/programming-guide/#windowing
-丹尼尔
推荐阅读
- c# - 在 Asp.Net Core 中实现是/否菜单的好方法是什么?
- python - 在 AWS Lambda 函数中获取“并非在字符串格式化期间转换的所有参数”异常
- azure-ad-b2c - Azure AD B2C 是否能够动态分组?
- arduino - Nucleo-H743Zi 上的 SPI 时钟工作不正常
- python - 部署到 heroku 后位置更改为 Ashburn
- python - 使用网络抓取从网站下载多个 pdf
- asp.net - 无法在 ASP.NET MVC 中将文件上传到服务器 - 始终计数为 0
- reactjs - React 中的延迟加载 util 函数
- maven - Maven with Url Argument Not Allowed in build.gradle 存储库
- reactjs - 反应组件没有占据整个屏幕宽度