microservices - 微服务的正确结构 - 基于订阅的模型
问题描述
我有用户服务、课程服务和订阅服务、电子邮件服务。他们应该如何相互作用以实现以下目标:
- 用户订阅课程(用户选择课程)(单门/多门课程)
- 将用户添加到课程(我们点击课程和用户)(单/多用户)
- 订阅时发送电子邮件,与用户和课程服务人员交谈以获取详细信息
我知道这是一个抽象的问题,但如果你引导我朝着正确的方向前进,那将是非常有帮助的。
解决方案
根据我的经验,如果您有两个相关的服务并且它们都需要另一个的部分信息(用户和课程的情况),那么出于性能原因,您应该存储另一个服务的信息。
我的意思是,在用户中,您应该存储每个用户订阅的课程的信息(通常是 id 或/和名称),并在课程中存储有关每个用户订阅的用户的信息。
保持信息正确同步的方法可能是使用像 kafka 这样的消息代理,其中每个服务将发布每个修改,而另一个服务将使用它。
例如,当用户退出课程时,用户服务将发布一条消息通知课程,然后这将正确更新,反之亦然。
这种方法的问题是最终的一致性,也许更好的解决方案可能是拥有一个订阅服务,其中订阅逻辑是集中的,然后在其各自的服务中只有用户和课程的特定信息。
在通知服务的情况下,我认为最好的方法是从消息代理侦听其他主题的服务,并且在进行订阅时,其他服务将在那里发布发送电子邮件的命令。
推荐阅读
- c - WASD movement with ncurses (Not sure why it doesnt work)
- javascript - puppeteer 无法使用我的 javascript 代码
- bash - BASH Shell 变量插值 - 无需 eval 或创建新变量
- mysql - WSO2-Api Manager 数据库 MySQL
- javascript - 如何一个接一个地为多个 HTML5 画布对象设置动画?
- ios - 当应用程序在 iOS 中运行时,是否在关闭后台通知的情况下收到静默通知?
- mysql - 当curdate()=未来日期MYSQL时如何删除事件
- database - 为什么表中的数据不显示?
- c# - 如何在不删除文本值的情况下“禁用”单选按钮,以及是否选中它
- android-studio - 移动文件夹后,Flutter 项目将无法在 Android Studio 上运行