Design patterns 如何协调microservice“;“不分享”;原则与「;“独立性”;
假设我的整个域有如下实体Design patterns 如何协调microservice“;“不分享”;原则与「;“独立性”;,design-patterns,service,architecture,microservices,Design Patterns,Service,Architecture,Microservices,假设我的整个域有如下实体 [ { id: 1, name: "Joe", age: 16, hometown: "Los Angeles", friends: [2] }, { id: 2, name: "Jack", age: 83, hometown: "Phily", friends: [1, 3] }, { id: 3,
[
{
id: 1,
name: "Joe",
age: 16,
hometown: "Los Angeles",
friends: [2]
},
{
id: 2,
name: "Jack",
age: 83,
hometown: "Phily",
friends: [1, 3]
},
{
id: 3,
name: "Susy",
age: 50,
hometown: "Dayton",
friends: [2]
}
]
我决定提供两种不同的服务
[
{
id: 1,
name: "Joe",
age: 16,
hometown: "Los Angeles"
},
{
id: 2,
name: "Jack",
age: 83,
hometown: "Phily"
},
{
id: 3,
name: "Susy",
age: 50,
hometown: "Dayton"
}
]
1。及
{
1: [2],
2: [1, 3],
3: [2]
}
两个人。因此,基本上,整个信息被分为两个位置存储(除了id
s,我猜它们是共享的)
以下是我看到的一些潜在问题:
- 在朋友管理器服务中,由于您只有
s,如果不将来自此服务的信息与来自个人信息管理器服务的信息进行组合,可能在整个系统中没有任何有用的操作李>id
- 按照前面的观点,假设我们想要一个用户界面,用户可以在其中管理好友关系。然后我们需要查询Friend Manager服务以获取此信息,并通过
执行“连接”。这意味着朋友管理器服务依赖于个人信息管理器服务,或者有第三个服务依赖于两者id
{
info: {
1: {
name: "Joe"
},
2: {
name: "Jack"
},
3: {
name: "Susy"
}
},
friendships: {
1: [2],
2: [1, 3],
3: [2]
}
}
这样,现在好友管理器服务就可以独立工作了。这样做的一些潜在缺点是
- 重复数据带来的额外存储成本
- “朋友管理器”服务中的名称可能已过时,因为从“个人信息管理器”服务接收更新时出现延迟或错误。然而,如果朋友管理器服务在需要时查询Person Info Manager服务中的姓名,那么它将始终具有最新的信息(查询还可以说明已删除的人员)
- person info和friend manager听起来都太小了,不适合作为单独的微服务,根据经验,它们应该映射到一个单独的微服务。假设有界上下文是域中发生的主要过程,而不是实体组
- 重复存储的额外成本在大多数情况下都不是问题,我们不是在谈论Twitter的规模,甚至他们通过数据重复来解决这个问题
- 要像示例中那样维护数据一致性,您需要跨不同的有界上下文定义可接受的一致性级别(根据业务规则/域逻辑)。这里经常出现的一个原则是。搜索与领域驱动设计相结合,你一定会发现很多东西:)
- 微服务直接调用其他微服务在某些情况下也可以工作,我的意思是看;)