【问题标题】:How do you design a dorne delivery sytem from the software architecture point of view?您如何从软件架构的角度设计无人机交付系统?
【发布时间】:2017-09-04 14:53:45
【问题描述】:

在我的硕士学位期末项目中,我决定设计一个无人机送货系统。主要目的是学习设计复杂的系统。

基本用例是这样的:

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

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

一般问题:

  • 如何设计这样的系统以实现可扩展性?我的意思是:系统可能被很多商家使用,如果他们同时访问我的API 100个订单,系统必须能够处理它。
  • 在设计这样的系统时,有哪些好的设计原则或模式?

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

系统组件:

  1. Java(Spring) 应用程序
    • 休息网络服务
    • 管理 doren 和 parces 的 Web 界面
    • 无人机路由的业务逻辑和算法
    • 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. 我认为生产者必须留在应用程序中,我的意思是与Web服务应用程序耦合。可以吗?

很抱歉这篇文章很长,也很抱歉我的英语很差。 非常感谢:)

【问题讨论】:

    标签: java architecture system software-design


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 2011-01-09
      • 2013-06-22
      • 2023-03-29
      • 2011-08-16
      相关资源
      最近更新 更多