Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Architecture 寻求有关Redis与RabbitMQ+的架构建议;空气钉_Architecture_Redis_Rabbitmq_Aerospike - Fatal编程技术网

Architecture 寻求有关Redis与RabbitMQ+的架构建议;空气钉

Architecture 寻求有关Redis与RabbitMQ+的架构建议;空气钉,architecture,redis,rabbitmq,aerospike,Architecture,Redis,Rabbitmq,Aerospike,我正处于架构规划的岔口,没有足够的Redis、Aerospike或RabbitMQ生产经验,不知道如何进行 有3+个生产商和15+个不同类型的工人。系统的可变负载范围为0-10k请求/秒。我有四个要求: 排队 锁定 酒吧/酒吧 数据交换 以下是架构如何以过于简单的方式运行: 当一个新的客户端请求到达时,生产者互斥锁会锁定该请求令牌以及将由工作人员使用的资源,它可以立即将任务发送到该工作人员,以表示“该生产者负责这些数据”。生产者将动态生成的任务推送到队列中。各种工作人员从队列中弹出并执行。如果一

我正处于架构规划的岔口,没有足够的Redis、Aerospike或RabbitMQ生产经验,不知道如何进行

有3+个生产商和15+个不同类型的工人。系统的可变负载范围为0-10k请求/秒。我有四个要求:

  • 排队
  • 锁定
  • 酒吧/酒吧
  • 数据交换
  • 以下是架构如何以过于简单的方式运行:

    当一个新的客户端请求到达时,生产者互斥锁会锁定该请求令牌以及将由工作人员使用的资源,它可以立即将任务发送到该工作人员,以表示“该生产者负责这些数据”。生产者将动态生成的任务推送到队列中。各种工作人员从队列中弹出并执行。如果一个工作进程失败,另一个工作进程将在超时后执行相同的任务。当工作程序完成时,它存储其结果,然后向所有生产者发布“任务ID complete”。(稍后详细介绍)如果工作者需要额外的用户输入,它将存储其会话,然后向所有生产者发布“任务ID需要更多信息”。假设制作者的一个工作人员请求了更多信息(通过订阅接收),而制作者仍然有一个客户端连接,它会打包并将数据请求发送到客户端,客户端将结束与制作者的HTTP连接。生产者现在解锁请求令牌,因为它没有连接。但是,其他工作人员可能仍在这种“无头”状态下处理,并且当其他工作人员完成其任务并满足依赖关系时,同一生产商可能仍会向队列发出更多任务。(只要客户端尚未重新连接到任何生产者)现在,当客户端重新建立HTTP连接时,它可能不会重新连接到同一生产者。因此,接收连接的生产者向其他生产者发布“我获得了令牌X的恢复客户端连接”。这将告诉可能仍在锁定资源并发出新任务的任何其他生产者,以停止处理工作人员结果并发出新任务。这个具有客户端连接的新生产者随后将锁定请求令牌和资源,这些资源将由现在未被阻止的工作者使用。(与处理积压的工作人员结果(如果有)一起,生产者确定新客户端信息可以解除阻止的依赖项,并开始发出更多任务,直到所有工作完成。然后将结果打包,保存到Postgres,归档到S3中,并将最终响应发送给客户端

    这让我陷入了进退两难的境地。为了简单起见,我可以使用Redis满足我的所有四个需求,但是我听说如果主服务器出现故障,集群很容易丢失写操作。也因为我总是需要新的数据,我的工人或生产者都无法从奴隶那里读取数据。所以我真的要用Redis集群复制到热备份。(无分片要求)

    更复杂但更安全的选择似乎是使用RabbitMQ对“pub/sub”进行排队和主题交换。同时使用Aerospike进行数据交换和互斥锁

    在过去,我曾有过NodeJS和Python维护到RabbitMQ的稳定AMQP连接的糟糕经历,这让我不敢再试一次。(正在取代的系统使用Redis+RabbitMQ)但我确实喜欢一切都只使用Redis的简单性

    所以,你们认为我可以安全地使用AWS Elasticache Redis集群,而不用担心在主服务器出现故障时可能会丢失写操作或读取陈旧数据吗?或者你认为使用RabbitMQ+Aerospike增加的复杂性会更具容错性,并为我省去长期的麻烦吗


    提前感谢您,感谢您花时间阅读这堵文字墙。

    我想我能给您的最好建议是创建一个抽象所有“队列”相关任务的层,然后您可以尝试不同的低级实现(redis、rabbitmq等)。