microservices - 更新/添加为单独的服务和获取为单独的服务
问题描述
我们开始将现有项目迁移到微服务架构中。在浏览了很多视频/讲座之后,我们得出一个结论,一个服务应该做一个任务,只做一个任务,并且应该擅长它。服务应该围绕Noun
和设计Verb
。
我们有一个基本上具有 CRUD 操作的实体。现在添加、更新和删除是最少使用的操作,但与这些操作相比,GET 请求太高了。通常,更新/添加/删除由管理员完成。
我们想到的是把 CRUD 实体分成两个服务
- EntityCUDService(创建/更新/删除)
- 实体查找服务(获取)
现在这两个服务都指向 mongo 中的同一个集合,或者说一些 SQL。现在,如果EntityCUDService
对集合/表进行了一些更改,则EntityLookupService
失败。
我们听说过维护语义版本控制,这听起来不错,但我们也听说微服务不应该共享模型/数据源。那么在我们有大量获取但同一实体的数十次更新/添加的情况下,处理此问题的最佳解决方案是什么
任何帮助是极大的赞赏。
解决方案
通常,微服务应该管理单个实体。因此,在您的情况下,您可以拥有一个微服务来管理实体(用于实体上的各种操作)。现在,如果您想在读写操作的基础上再次拆分服务,那么您将遵循 CQRS 模式。在 CQRS 中,您根据读写操作拆分您的微服务。因此,现在您将在同一实体上拥有 2 个服务,一个称为命令服务,另一个称为查询服务。我会建议首先使用一项服务来管理实体,然后如果需要将其拆分为更多单独的服务以进行读取和写入操作。同样,如果您要使用 CQRS,请查看事件溯源,因为它非常适合微服务设计中的 CQRS。
推荐阅读
- python-3.x - Odoo 11 中 inverse_name 的意外行为
- c++ - 如何判断表达式是在编译时还是运行时评估的?
- php - 为什么我的 html 代码不能正常工作
- angular - 滚动时鼠标离开时不会触发 Mouseleave 事件
- oracle - 如何在带有检查约束的 oracle 11g 中将日期与系统日期进行比较?
- codenameone - 侧边菜单和可滚动的表单/容器
- reporting-services - 如何解决我在 Visual Studio 报告中的表达式中除以零的错误?
- c# - 为什么 Entity Framework 由于 Boolean 和 Int 数据类型而无法查询该表?
- android - 当大小变为零时,后退按钮上的 findFragmentById 变为空白
- vue.js - 单击时如何从leafletjs折线中选择一条线?