比方说,我的整个域都有类似的实体
[
{
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]
}
]
我决定提供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]
}
对于2。因此,基本上,整个信息已被划分为存储在2个位置中(我猜是共享的id
除外)。
这是我看到的一些潜在问题:
id
,因此如果不将该服务中的信息与Person Info Manager服务中的信息进行合并,那么在整个系统中可能没有任何有用的东西。 id
执行“加入”。这意味着Friend Manager Service依赖于Person Info Manager服务,或者某些第三项服务依赖于两者。要纠正这些潜在问题(我不确定它们是否是真正的问题;这就是为什么我要提出问题),我们可以让它们共享更多数据。假设您至少需要了解一个人的name
才能管理友谊。那我们可以有
{
info: {
1: {
name: "Joe"
},
2: {
name: "Jack"
},
3: {
name: "Susy"
}
},
friendships: {
1: [2],
2: [1, 3],
3: [2]
}
}
,以便现在的Friend Manager服务可以独立运行。与此相关的一些潜在缺点是
答案 0 :(得分:0)
我的2美分:
个人信息和朋友管理器听起来太小,无法用作单独的微服务,这通常应映射到Bounded Context。想象一下,有界上下文是您域中发生的主要过程,而不是实体组。
大多数情况下,重复存储的额外成本不是问题,我们不是在谈论Twitter规模,甚至他们通过数据复制https://www.infoq.com/presentations/Twitter-Timeline-Scalability
要像示例中那样保持数据一致性,您需要在不同的有界上下文中定义可接受的一致性级别(根据业务规则/域逻辑)。 Eventual Consistency是经常出现的一项原则。结合域驱动设计进行搜索,您一定会在这里发现很多东西:)
直接调用其他微服务的微服务在某些情况下也可以使用,我的意思是看看Netflix;)