消息队列VS任务队列架构

问题描述 投票:0回答:3

我想构建一个可以执行一些互联网扫描(用Python)来收集各种数据的产品。

我想用执行这些收集工作的任务来设计它。

可以有多个扫描在不同的输入上并行运行,因此任务可以重复,因为它们有不同的输入要操作。

我想知道哪种架构最适合它,哪种技术是最好的。

我想到使用 RabbitMQ 来存储任务,使用 Redis 来存储输入。

初始输入触发扫描,然后每个任务吐出其输出,该输出可能是其他任务的输入。

您对这种可能的设计有何看法?可以改进吗?其他技术?

design-patterns architecture message-queue task-queue
3个回答
1
投票

这取决于输入的大小。如果这些相对较小,我会只使用消息代理并发送消息中的所有内容(即任务类型及其输入) - 否则最好使用一些外部存储。根据持久性要求,可能应该考虑持久存储(如数据库)。


0
投票

一种选择是使用现有的编排器,它隐藏了大部分复杂性,而不是基于队列和存储构建自定义解决方案。查看 temporal.io 开源项目,它允许使用高级编程语言编排任务。


0
投票

一种可能的架构是使用 RabbitMQ 来存储任务并使用 Redis 来存储输入。初始输入触发扫描,每个任务输出可用作其他任务输入的数据。以下是需要考虑的几点: RabbitMQ可以高效地处理任务队列,允许多个任务并行运行。 RabbitMQ 消息代理可以存储任务并确保它们按顺序处理。当任务完成时,结果可以发送到另一个队列或交换。

例如,您可以为每种类型的扫描(例如端口扫描、Web 扫描等)分配一个任务队列,并且多个工作人员可以同时处理每个队列中的任务。 Redis 可以有效地存储任务的输入。您可以使用 Redis 哈希来存储每个任务的输入,哈希键是任务 ID,哈希值是输入参数。 例如,您可以为每个端口扫描任务创建一个哈希值,哈希键是要扫描的 IP 地址,哈希值是端口范围和超时设置。 您需要一种方法来处理任务重复,因为多个任务可能具有相同的输入。您可以使用重复数据删除系统来检查具有相同输入的任务是否已被处理。

例如,您可以使用Redis集合来存储已经处理过的输入,集合键是任务类型,集合值是输入参数。 最后,您需要考虑用于构建扫描的编程语言和库。对于此类项目,Python 是一个不错的选择,因为它有许多用于互联网扫描和数据收集的库和工具,例如 Scapy、Nmap 和 Requests。 总体而言,所提出的使用 RabbitMQ 进行任务队列和 Redis 进行输入存储的架构可以是处理不同输入的并行扫描的有效方法。但是,根据您的具体需求和要求,可能还有其他架构和技术可以同样好甚至更好。

© www.soinside.com 2019 - 2024. All rights reserved.