您如何从软件架构的角度设计无人机投递系统?

How do you design a dorne delivery sytem from the software architecture point of view?

对于我的硕士学位期末项目,我决定设计一个无人机交付系统。主要目的是学习设计复杂的系统。

基本用例是这样的:

  1. 用户前往商户网店,选择商品,选择送货方式"Drone delivery"并选择送货地点。
  2. 商家网站,API 调用我们的无人机递送系统 (DDS) 应用程序以注册新的递送订单。(该订单将包含我们需要的所有信息:包裹取件地点和目的地位置...)
  3. 基于无人机位置的DDS应用,基于算法会计算并标记哪架无人机可以在最短的时间内交付该订单。
  4. 选择的无人机空闲时将派送订单。

到目前为止一切顺利。我的问题与该系统的软件架构有关。我有一些一般性问题和一些具体问题。

一般问题:

具体问题:
到目前为止,我已经想出了这个架构:

系统组件:

  1. Java(Spring)申请
    • 其余网络服务
    • Web 界面管理 dorens 和 parces
    • 无人机路由的业务逻辑和算法
    • producer/consumer 用于 RabbitMQ
  2. Mysql 服务器
  3. RabbitMq

系统流程:

  1. 商家点击 REST API 注册订单
  2. Java 应用程序将订单保存到 Mysql 数据库。
  3. 将订单保存到数据库后,生产者将订单放入RabbitMQ中的队列
  4. 消费者消费 RabbitMQ 订单队列。它接受每个订单并根据算法计算提供最佳交付时间的无人机。每个无人机在 RabbitMQ 中都有一个单独的队列。找到最好的无人机后,消费者将订单插入 RabbitMQ 的无人机队列中。消费者在此过程中还会查询 mysql 数据库。
  5. 只要无人机空闲,它就会与系统通信,询问下一个订单。系统将查看无人机 RabbitMQ 队列并从那里获取下一个订单。

我的问题与消费者和生产者有关:

  1. 消费者有逻辑是可以的,在我的例子中它将有确定最佳无人机的算法,为此它还需要与 mysql 交谈,用于检索无人机位置?这是一个好习惯吗?如果不是,我该怎么做?

  2. 消费者留在应用程序中是最佳做法吗?现在,消费者 运行 与 Web 服务在同一台服务器上,并且代码没有与 Web 服务代码分开。我在想也许将来您可能需要将消费者转移到单独的服务器中?您认为消费者如何才能轻松地与应用程序分离?

  3. 我认为生产者必须留在应用程序中,我的意思是与网络服务应用程序耦合。可以吗?

抱歉这么长 post,还有我糟糕的英语。 非常感谢:)

是的,消费者应该有逻辑。这是一个标准 EIP routing pattern.

如果您正确地将业务逻辑层与数据访问层分开(您的队列访问是数据访问层),那么让它们共享一个公共项目可能不是问题。您最终可能希望将您的业务 logic/domain 模型与 Web 服务和 router/consumer 分开,但这些都是更多的部署和打包问题。

只要您将 Web 服务代码排除在业务逻辑之外(反之亦然),您可能就没问题,您只需要多次部署整个事情,并且只公开相关的端点对于任何给定的部署。不过,如果您通过库将层分开,您最终可能会更快乐,因为它实际上会强制不混合关注点。

是的,生产者必须与 Web 服务一起部署,只要确保您知道作为数据访问层,它位于单独的 package/class 中。这将使您的测试更容易。