如何在微服务架构中处理删除?

时间:2020-10-22 22:00:15

标签: design-patterns architecture event-handling microservices domain-driven-design

我想创建一个带有任务/问题/聊天的项目管理系统。这不只是出于学习目的的商业用途。它是简化的说明,仅包含提出问题所需的内容。

我遇到的第一个问题是如何使用任务服务添加任务,而不用每次都询问用户是否是给定项目的成员。我知道更多的beetwen服务通信==更多的问题,更多的延迟以及通常的PreventBadTM。因此,我决定为每个微服务使用JWT。想要通过任务服务添加任务的用户首先需要询问Auth服务:给我jwt提供Task,projectX和include权限。 Auth将调用Project服务以验证用户是否为成员并生成正确的JWT令牌。我们仍然有通信beetwen服务,但这只是一次令牌生命周期的调用,而不是每次对任务服务进行调用。问题来了。

如果从项目中删除/禁止用户或项目被删除怎么办? 如果任务服务不关心项目-它仅关心JWT是否有效,以便用户可以为项目ID Y创建任务X,那么如何防止被禁止的(来自项目)用户访问此服务?同样,如果项目被删除并且项目服务向事件总线“我已删除项目X”发出事件,则任务服务将读取此事件并删除分配给项目X的所有任务。但是当某些用户仍然具有有效的访问令牌并且他创建时该怎么办事件处理后的另一个任务?任务服务不会检查项目是否仍然存在,结果我们在数据库中悬挂了任务。

我对这个问题的解决方案是在任务服务数据库中存储有关现有项目的信息。仅ID,因此内存/存储空间最小。因此,当项目服务发出“项目已删除事件”时,任务服务不仅会清除具有给定projectId的所有任务,还会删除存储的projectId,因此无法创建任务。这是一个好方法吗?被禁止的用户呢?数据库中的另一个条目和要订阅的事件?

1 个答案:

答案 0 :(得分:0)

我对这个问题的解决方案是在任务服务数据库中存储有关现有项目的信息。仅ID,因此内存/存储空间最小。因此,当项目服务发出“项目已删除事件”时,任务服务不仅会清除具有给定projectId的所有任务,还会删除存储的projectId,因此无法创建任务。这是个好方法吗?

绝对,任务应该知道它属于哪个项目,所以我认为这没有什么不对-这很有意义。

被禁止的用户呢?数据库中的另一个条目和要订阅的事件?

您提到“ Auth将调用Project服务以验证用户是否为成员并生成正确的JWT令牌”,因此结果应为Project Service应说明用户不是该项目的成员。现在,在您的系统中,您可能会拥有//please correct me if this is the wrong type, //i know i probably need to do a bit of parsing between python and C++ types std::vector<std::unordered_map<std::string, std::string>> > = myprogram.getconfig() 服务,该服务具有禁止用户使用的API。我认为应该发生以下情况:

  • users服务中,您有一个名为projects的表,该表在membersN to N之间具有user_id关系
  • 当管理员(不确定系统中的禁止流程如何)想要禁止用户时,它将在project_id服务中调用API
  • users服务将发出一个事件,说明users
  • user 1 was banned服务将侦听此事件并从projects表中删除此user_id的记录