您如何从软件架构的角度设计无人机投递系统?
How do you design a dorne delivery sytem from the software architecture point of view?
对于我的硕士学位期末项目,我决定设计一个无人机交付系统。主要目的是学习设计复杂的系统。
基本用例是这样的:
- 用户前往商户网店,选择商品,选择送货方式"Drone delivery"并选择送货地点。
- 商家网站,API 调用我们的无人机递送系统 (DDS) 应用程序以注册新的递送订单。(该订单将包含我们需要的所有信息:包裹取件地点和目的地位置...)
- 基于无人机位置的DDS应用,基于算法会计算并标记哪架无人机可以在最短的时间内交付该订单。
- 选择的无人机空闲时将派送订单。
到目前为止一切顺利。我的问题与该系统的软件架构有关。我有一些一般性问题和一些具体问题。
一般问题:
- 您如何设计这样的系统才能实现可扩展性?我的意思是:这个系统可能有很多商家在用,如果他们同时命中我的API100个订单,系统肯定能处理。
- 在设计这样的系统时,有哪些好的设计原则或模式?
具体问题:
到目前为止,我已经想出了这个架构:
系统组件:
- Java(Spring)申请
- 其余网络服务
- Web 界面管理 dorens 和 parces
- 无人机路由的业务逻辑和算法
- producer/consumer 用于 RabbitMQ
- Mysql 服务器
- RabbitMq
系统流程:
- 商家点击 REST API 注册订单
- Java 应用程序将订单保存到 Mysql 数据库。
- 将订单保存到数据库后,生产者将订单放入RabbitMQ中的队列
- 消费者消费 RabbitMQ 订单队列。它接受每个订单并根据算法计算提供最佳交付时间的无人机。每个无人机在 RabbitMQ 中都有一个单独的队列。找到最好的无人机后,消费者将订单插入 RabbitMQ 的无人机队列中。消费者在此过程中还会查询 mysql 数据库。
- 只要无人机空闲,它就会与系统通信,询问下一个订单。系统将查看无人机 RabbitMQ 队列并从那里获取下一个订单。
我的问题与消费者和生产者有关:
消费者有逻辑是可以的,在我的例子中它将有确定最佳无人机的算法,为此它还需要与 mysql 交谈,用于检索无人机位置?这是一个好习惯吗?如果不是,我该怎么做?
消费者留在应用程序中是最佳做法吗?现在,消费者 运行 与 Web 服务在同一台服务器上,并且代码没有与 Web 服务代码分开。我在想也许将来您可能需要将消费者转移到单独的服务器中?您认为消费者如何才能轻松地与应用程序分离?
我认为生产者必须留在应用程序中,我的意思是与网络服务应用程序耦合。可以吗?
抱歉这么长 post,还有我糟糕的英语。
非常感谢:)
是的,消费者应该有逻辑。这是一个标准 EIP routing pattern.
如果您正确地将业务逻辑层与数据访问层分开(您的队列访问是数据访问层),那么让它们共享一个公共项目可能不是问题。您最终可能希望将您的业务 logic/domain 模型与 Web 服务和 router/consumer 分开,但这些都是更多的部署和打包问题。
只要您将 Web 服务代码排除在业务逻辑之外(反之亦然),您可能就没问题,您只需要多次部署整个事情,并且只公开相关的端点对于任何给定的部署。不过,如果您通过库将层分开,您最终可能会更快乐,因为它实际上会强制不混合关注点。
是的,生产者必须与 Web 服务一起部署,只要确保您知道作为数据访问层,它位于单独的 package/class 中。这将使您的测试更容易。
对于我的硕士学位期末项目,我决定设计一个无人机交付系统。主要目的是学习设计复杂的系统。
基本用例是这样的:
- 用户前往商户网店,选择商品,选择送货方式"Drone delivery"并选择送货地点。
- 商家网站,API 调用我们的无人机递送系统 (DDS) 应用程序以注册新的递送订单。(该订单将包含我们需要的所有信息:包裹取件地点和目的地位置...)
- 基于无人机位置的DDS应用,基于算法会计算并标记哪架无人机可以在最短的时间内交付该订单。
- 选择的无人机空闲时将派送订单。
到目前为止一切顺利。我的问题与该系统的软件架构有关。我有一些一般性问题和一些具体问题。
一般问题:
- 您如何设计这样的系统才能实现可扩展性?我的意思是:这个系统可能有很多商家在用,如果他们同时命中我的API100个订单,系统肯定能处理。
- 在设计这样的系统时,有哪些好的设计原则或模式?
具体问题:
到目前为止,我已经想出了这个架构:
系统组件:
- Java(Spring)申请
- 其余网络服务
- Web 界面管理 dorens 和 parces
- 无人机路由的业务逻辑和算法
- producer/consumer 用于 RabbitMQ
- Mysql 服务器
- RabbitMq
系统流程:
- 商家点击 REST API 注册订单
- Java 应用程序将订单保存到 Mysql 数据库。
- 将订单保存到数据库后,生产者将订单放入RabbitMQ中的队列
- 消费者消费 RabbitMQ 订单队列。它接受每个订单并根据算法计算提供最佳交付时间的无人机。每个无人机在 RabbitMQ 中都有一个单独的队列。找到最好的无人机后,消费者将订单插入 RabbitMQ 的无人机队列中。消费者在此过程中还会查询 mysql 数据库。
- 只要无人机空闲,它就会与系统通信,询问下一个订单。系统将查看无人机 RabbitMQ 队列并从那里获取下一个订单。
我的问题与消费者和生产者有关:
消费者有逻辑是可以的,在我的例子中它将有确定最佳无人机的算法,为此它还需要与 mysql 交谈,用于检索无人机位置?这是一个好习惯吗?如果不是,我该怎么做?
消费者留在应用程序中是最佳做法吗?现在,消费者 运行 与 Web 服务在同一台服务器上,并且代码没有与 Web 服务代码分开。我在想也许将来您可能需要将消费者转移到单独的服务器中?您认为消费者如何才能轻松地与应用程序分离?
我认为生产者必须留在应用程序中,我的意思是与网络服务应用程序耦合。可以吗?
抱歉这么长 post,还有我糟糕的英语。 非常感谢:)
是的,消费者应该有逻辑。这是一个标准 EIP routing pattern.
如果您正确地将业务逻辑层与数据访问层分开(您的队列访问是数据访问层),那么让它们共享一个公共项目可能不是问题。您最终可能希望将您的业务 logic/domain 模型与 Web 服务和 router/consumer 分开,但这些都是更多的部署和打包问题。
只要您将 Web 服务代码排除在业务逻辑之外(反之亦然),您可能就没问题,您只需要多次部署整个事情,并且只公开相关的端点对于任何给定的部署。不过,如果您通过库将层分开,您最终可能会更快乐,因为它实际上会强制不混合关注点。
是的,生产者必须与 Web 服务一起部署,只要确保您知道作为数据访问层,它位于单独的 package/class 中。这将使您的测试更容易。