微服务中的混合通信方法

时间:2018-07-12 18:33:13

标签: architecture microservices

因此,我正在努力解决一些有关微服务以及那时之间的通信的概念。虽然我没有期望获得专门针对技术的答案,但我正在使用 asp.net核心Web API 来帮助回答我的问题。

场景

我的资源是一个小部件。可以通过以下两种方式之一更新此小部件:

  1. 通过用户通过用户界面
  2. 通过外部事件(消息发布到公交车上)

假设

基于各种文章,博客等,我也在以下假设下进行工作:

  1. 微服务应拥有其数据。因此,在这种情况下,我应该只有一个拥有小部件资源的微服务
  2. 用户直接更新表示请求/响应通信,因此建议使用REST
  3. 该事件消息表明我也应该连接到队列并处理来自总线的消息
  4. 与在IIS中托管的Web项目之类的东西内部相比,消息使用者最好作为一种服务运行

问题

因此,基于上述所有内容,我想到了创建一个作为Windows服务运行的ASP.NET Core项目。我知道.net core 2.1中有一些最近的更改,这些更改使其变得更加容易。

这与仅创建2个服务来处理其余的调用和一个消耗总线消息的服务形成了鲜明的对比,这似乎与我的第一个假设相反,并且从长远来看,维护起来更加困难。

所以我的问题是

  1. 我的假设有效吗?
  2. 像这样在服务中混合通信方法是一个好主意还是应该创建两个服务(每种通信类型一个)?
  3. 是否有另一种方法可以更符合微服务背后的意识形态?
  4. 如果我要在节点中执行此操作,那么该方法是否类似于让节点处理来自总线的消息以及传入的REST调用?

1 个答案:

答案 0 :(得分:1)

记住为什么您正在使用微服务。使用它们并不是一个目标。它们是实现某些目标的工具,例如强制模块化,独立部署和更并行的开发。

没有关于其尺寸的一般指导。使它们尽可能小是不可行的。而是找到 right 大小。不是最小的尺寸。

因此将直接和异步数据更新分为两个服务似乎是可疑的。根本不需要驾驶。

由于微服务应该拥有自己的数据,因此将这两个问题都由在该数据上运行的单个微服务来控制是很自然的。

此外,避免混合使用交流方式也是非目标。

  

与在IIS中托管的Web项目之类的东西内部相比,与消息使用者相比,消息使用者更好地作为服务运行

从技术上讲这不是事实。为了实现冗余,您需要在每个队列上运行多个使用者。您永远不能依靠一个消费者或总是至少有一个消费者。因此,Windows服务无济于事。在我看来,从普通的Web应用程序内部进行此操作就没有问题。它还有可能节省您对Windows服务的需求。他们很难一起工作(部署有点讨厌)。

在我看来,您为了满足某些抽象指导而使事情过于复杂。不要基于这样的全面指导进行设计。关于具体案例的架构师。

据我所知,您所需要的只是一个由IIS托管的ASP.NET Web应用程序,它可以完成所有这些工作,包括数据处理。但是,如果您需要引入服务,则可以考虑将数据处理拆分到另一个为UI应用程序提供服务的ASP.NET Web应用程序中。该服务将包括检索和更改数据的方法以及异步更新的某种通知(例如事件,但跨越服务边界)。