微服务是否应该 RESTful 公开
Should microservice have RESTful exposure
这个问题不是代码而是架构相关的。
当您在 Web 应用程序中构建微服务时,您需要以某种方式公开该服务并使其可访问。
我知道的方式:
- 常用数据库
- restful 端点
- 消息队列
所以我的问题是,如果我有一个微服务 运行,例如以事件驱动的方式连续收集数据,向这个微服务添加端点是个好主意吗?我的论点是,我对 RESTFul API 的理解是,如果没有请求,API 应该空闲并且什么也不做,这实现了基于请求的可伸缩性。
如果我将 RESTFul API 添加到已经在事件驱动的基础上运行代码的微服务,那么微服务可以通过两种方式接收工作负载,一种是 API请求,其他是来自服务的实际计算部分的事件。
例子
假设我有一个从 Twitter 读取推文的微服务。该服务流式传输推文,这意味着每次发布推文时都会触发一个事件。为了简单起见,假设该服务将它收到的推文保存在 RAM 中,而不将其存储在任何类型的数据库中。例如,服务的 RESTFul API 部分现在应该通过允许用户请求收集的推文列表来公开推文。
在这种情况下,可以从 2 个方向接收工作负载:发布推文或用户请求推文。
在我看来,这似乎是一个可扩展性问题,因为您必须注意微服务的两个不同方面。
关于这个话题是否有任何普遍共识?
is adding endpoints to this micro-service a good idea?
在我看来,从架构的角度来看,如果事件驱动服务与您的服务领域保持一致,那么您的事件驱动服务公开休息端点不是问题,但您需要考虑一些方面:
缩放服务变得稍微复杂一些,因为您需要检查两个值来触发缩放过程:请求数(从服务的 REST 端来看)和内存消耗(从服务的事件驱动方面的观点)。
即使你的内存消耗很小但请求数量更多,也许当你扩展时,你会在服务、处理器和/或存储的其余端占用更大的内存... 或者相反,您在服务的事件驱动端消耗了大量内存,但请求很少,一侧的重量(REST ou Event drive)将成为总足迹的一部分。
考虑到你提出的问题,我认为,更一致的解决方案是将你的服务分成两部分(两个服务),一个专门用于读取(其余一个),另一个专门用于写入(事件驱动的一个) ).此方案允许您根据内存、处理器、请求或存储需求独立扩展这些部分...
描述的场景包含在称为 CQRS 的模式中,您可以在此处查看:https://martinfowler.com/bliki/CQRS.html
Is there any general consensus around this topic?
共识...好吧,这很难说,您会看到一些可以用来解决这种情况的模式,其中一个比其他模式更正确...服务治理的组织方面...环境方面的因素和等等...在我看来,一个好的解决方案是在两个服务中进行职责分离。
这个问题不是代码而是架构相关的。
当您在 Web 应用程序中构建微服务时,您需要以某种方式公开该服务并使其可访问。
我知道的方式:
- 常用数据库
- restful 端点
- 消息队列
所以我的问题是,如果我有一个微服务 运行,例如以事件驱动的方式连续收集数据,向这个微服务添加端点是个好主意吗?我的论点是,我对 RESTFul API 的理解是,如果没有请求,API 应该空闲并且什么也不做,这实现了基于请求的可伸缩性。
如果我将 RESTFul API 添加到已经在事件驱动的基础上运行代码的微服务,那么微服务可以通过两种方式接收工作负载,一种是 API请求,其他是来自服务的实际计算部分的事件。
例子
假设我有一个从 Twitter 读取推文的微服务。该服务流式传输推文,这意味着每次发布推文时都会触发一个事件。为了简单起见,假设该服务将它收到的推文保存在 RAM 中,而不将其存储在任何类型的数据库中。例如,服务的 RESTFul API 部分现在应该通过允许用户请求收集的推文列表来公开推文。
在这种情况下,可以从 2 个方向接收工作负载:发布推文或用户请求推文。
在我看来,这似乎是一个可扩展性问题,因为您必须注意微服务的两个不同方面。
关于这个话题是否有任何普遍共识?
is adding endpoints to this micro-service a good idea?
在我看来,从架构的角度来看,如果事件驱动服务与您的服务领域保持一致,那么您的事件驱动服务公开休息端点不是问题,但您需要考虑一些方面:
缩放服务变得稍微复杂一些,因为您需要检查两个值来触发缩放过程:请求数(从服务的 REST 端来看)和内存消耗(从服务的事件驱动方面的观点)。
即使你的内存消耗很小但请求数量更多,也许当你扩展时,你会在服务、处理器和/或存储的其余端占用更大的内存... 或者相反,您在服务的事件驱动端消耗了大量内存,但请求很少,一侧的重量(REST ou Event drive)将成为总足迹的一部分。
考虑到你提出的问题,我认为,更一致的解决方案是将你的服务分成两部分(两个服务),一个专门用于读取(其余一个),另一个专门用于写入(事件驱动的一个) ).此方案允许您根据内存、处理器、请求或存储需求独立扩展这些部分...
描述的场景包含在称为 CQRS 的模式中,您可以在此处查看:https://martinfowler.com/bliki/CQRS.html
Is there any general consensus around this topic?
共识...好吧,这很难说,您会看到一些可以用来解决这种情况的模式,其中一个比其他模式更正确...服务治理的组织方面...环境方面的因素和等等...在我看来,一个好的解决方案是在两个服务中进行职责分离。