我有两个微服务,一个微服务的数据库包含用户表,另一个微服务的数据库包含组表。 users
有很多,每个user
可以属于许多groups
或根本没有group
,每个group
可以包含很多users
或没有完全users
。在groups数据库中,我创建了具有两列groups_users
和userId
的联接表groupid
。
我知道使用Sequelize我必须在组微服务中执行以下操作:
export default (sequelize, DataTypes) => {
const Groups = sequelize.define('Groups', {
uuid: {
type: Sequelize.UUID,
defaultValue: uuidv4().replace(/-/g, ""),
primaryKey: true
},
name: Sequelize.STRING
});
Groups.associate = (models) => {
Groups.belongsToMany(models.Users, {
through: 'groups_users',
as: 'groups',
foreignKey: 'userId'
});
};
return Groups;
};
但是在这一行:
Groups.belongsToMany(models.Users, {
我还没有模型。用户,因为它在另一个微服务中,所以在这种情况下,处理此问题的最佳方法是什么?
答案 0 :(得分:0)
构建微服务时的一个好习惯是,应始终为微服务提供自己的数据库。让其他有界上下文访问您的数据库是迈向“死亡之星”陷阱模式(架构反模式)的第一步,在这种模式下,微服务由于高度耦合而相互纠缠。
为解决您的问题,您可能希望为您的组微服务提供用户数据的副本/部分。这样,两个微服务都将具有持久层独立性。
消息队列是一种可用于在有界上下文(用户和组)之间实现数据共享的技术。每当用户在用户表上记录更改时,就可以在队列上发送消息,并且后台守护程序可以侦听此队列中的更改,并在组数据库上创建用户记录的副本/部分。
更多参考:
http://www.pogsdotnet.com/2018/08/api-gateway-in-nutshell.html
答案 1 :(得分:0)
我认为您也可以在组模型上创建实例方法以从另一个微服务中获取用户。如果您会发现关联也是定义实例方法的方式。
您正在建立关联以获取与实例方法相同的组用户。
group.fetchUser() // should return list of user for this group right?
Group.prototype.fetchUser = () => {
write logic to fetch users from other microservice
}
以相同的方式,您可以定义逻辑来提取用户所属的所有组。
尽管这里要指出的一个重要主题是组有很多用户,但不属于这里。和用户属于许多组