architecture - 在发布-订阅消息系统中同步新的/取消同步的微服务
问题描述
作为一个人为的示例,假设我有一个Posts
用于包含所有博客文章的博客 Web 应用程序的服务。这与其他服务共存,例如Users
和UserLikes
,并且这些服务通过基于 pub-sub 的消息代理进行通信。
该UserLikes
服务允许用户“喜欢”某些帖子,并维护一个活跃用户列表以确保一致性。为此,它订阅来自Users
服务的消息以供用户创建/删除/更新。
这一切都很好,但假设现在我想添加一个UserDislikes
服务。此服务在当前用户创建后生效,因此它不会从Users
服务接收当前用户作为新用户事件。我们应该如何将这项新服务与当前用户列表同步?
我最初的想法是让Users
服务定期发布所有当前用户对象的列表(比如 S3),并将此事件发布到UserSync
主题。但是,很少需要像这样同步,而且导出不会响应另一个服务需要完全同步的事件。那么解决方案是什么?也许是服务订阅并在其他服务请求时导出 的UserSyncRequest
消息主题?Users
还有其他想法吗?
解决方案
在您的情况下,首先我不会在 UserLike 或 UserDislike Service 中维护活动用户列表。
您正在维护一个列表,这样如果用户被删除,那么它不应该能够喜欢一个帖子。
在 99% 或更多的情况下,如果用户被删除,他的所有访问权限都将被撤销,用户将无法调用 API 来点赞帖子。所以无论如何,只有有效的用户才会调用 API。
对于那 1% 的用户仍然具有访问权限的情况,在 UserLike 服务中维护用户列表将无济于事,因为在 UserLike 服务中处理已删除的事件也会有延迟。
现在,如果我真的想在 UserLike 或 Dislike Service 端维护一个列表
首先,我将订阅该列表,以便我也开始获取事件但不处理它
然后我会调用用户服务的api分批给我用户
初始同步后,我将开始处理事件。
不执行 UserSyncRequest 的原因是所有 UsersEvent 的侦听器都会收到他们已经处理过的事件。
推荐阅读
- tailwind-css - 我想让我的自定义顺风类使用媒体前缀
- spring - FCM 和自我证明问题(重新打开)
- javascript - jest spyOn navigator.mediaDevices
- csv - 如何从所有 csv 文件中添加第 n 列并存储在另一个 csv 文件中(标题是该列来自的文件名)?
- sap-cloud-sdk - 批处理请求问题(删除不起作用)
- machine-learning - 我有 2 个文件夹。一个图像在 1 个文件夹中,另一个图像在另一个文件夹中。我必须比较两张图片并找出不同之处
- python - M2Crypto.RSA.RSAError:数据大于 mod len?
- reactjs - 检查 Modal 是否在玩笑酶中使用条件道具渲染
- azure - 自定义容器中的 Azure Web App,环境变量未从应用服务传播到容器
- assembly - 如何使用 objdump 查找导致崩溃的指令