【问题标题】:How to implement a scheduled job as a microservice如何将计划作业实现为微服务
【发布时间】:2020-06-04 20:22:36
【问题描述】:

我有一个 Spring Boot 应用程序,它为 Angular Web 界面提供 REST API。

此 Spring Boot 应用程序中当前还有一个计划作业。工作是用一些实体填充数据库,比如书籍(它们取自外部来源,更具体地说,来自网站)。我想把这个工作放到一个单独的微服务中。

问题是微服务应该直接使用共享数据库还是通过 REST 访问主应用程序。在第一种情况下,一些(如果不是全部)模型和服务将被共享,看起来不太好。但在第二种情况下,每次访问数据库都将通过第一个应用程序。可以吗?

【问题讨论】:

  • 创建单独的微服务背后的基本原理是什么?这些实体不属于现有微服务的范围吗?
  • 不,它们确实属于同一范围。就是想试试微服务架构,看看什么时候能简化应用

标签: spring-boot microservices


【解决方案1】:

查看SOLID设计原理。

S - 代表Single Responsibility

微服务架构中还有一个模式,同名:Single Responsibility Principle

单一职责原则是定义的原则之一 作为 SOLID 设计模式的一部分。这意味着一个单位,无论是 类、函数或微服务应该只有一个 责任。

在任何时候,一个微服务都不应该有多个 责任。

您应该根据您的应用程序设计决定哪个微服务应该做什么,您肯定比我们更清楚。

但是在阅读了您的描述后,我建议以下内容:

  • 您当前的database-microservice 应连接到数据库并接受HTTP 请求以将书籍保存在数据库中;

  • 您的新cronjob-microservice 应该及时开始工作,从网站获取书籍并向database-microservice 发送HTTP 请求,因此它不应该连接到数据库。

    李>

【讨论】:

  • 我也倾向于这个选项
【解决方案2】:

另一种选择是使用像 ActiveMQ 这样的队列而不是 REST。

例如,cronjob-service 获取书籍并验证数据。 您可以将数据以 csv 等文件格式存储在某处。它可以存储在 AWS 上的 S3 存储桶或类似的东西上。 cronjob-service 然后通过队列向该文件发送引用,database-service 获取数据并存储它。

相对于 REST 的优势在于,任务不会丢失。如果您的 database-service 由于某种原因已关闭或被占用,则 REST 请求将返回 404,您必须针对它实施故障保护。使用队列,任务存储在队列中。即使database-service 实例开始处理任务并由于某种原因失败,该任务仍然在队列中,另一个database-service 实例可以接手并处理它。

【讨论】:

    猜你喜欢
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2019-02-21
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    相关资源
    最近更新 更多