【问题标题】:How to share a set of data between several processes?如何在多个进程之间共享一组数据?
【发布时间】:2012-12-15 18:55:25
【问题描述】:

我们需要建立一个系统,让多个进程在同一个数据集上工作。这个想法是有一组可以被我们的工作进程(异步)拉取的元素(即没有重复的值)。进程可能分布在多台服务器上,因此我们需要一个分布式解决方案。

目前,我们正在考虑的模式是使用 Redis 来保存一个集合,该集合保存工作数据。每个进程都应该连接到集合,并从中弹出一个值。 spop 的随机功能实际上对我们来说是一个加分项,因为我们需要随机访问集合中的元素。数据必须从我们的主 PostgreSQL 数据库中填充。

就像我说的,我们还有一个 PostgreSQL 数据库可供查询,进程可以在请求元素时访问该数据库。但是,我们不知道在重负载下是否会成为瓶颈。我们确实期望在这个子系统上进行大量 - 到非常大量的并发访问(想想数百甚至数千个进程)。

如果与此相关,我们使用 Python 和 rQ 来处理异步任务(作业和工作人员)。

编辑:就大小而言,预计元素不会很大 - 顶部大小应该在 500 - 1000 字节左右。它们基本上是 URL,因此除非发生奇怪的事情,否则它们应该远低于该大小。元素的数量将取决于并发进程的数量,因此大约 10 - 50 K 的元素可能是一个不错的选择。请记住,这更像是一个临时区域,因此应该更关注速度而不是大小。

总的来说,我的问题是:

  1. 在使用多个进程时,Redis 设置是否适合共享访问?是否有任何数据可以让我们知道该解决方案将如何扩展?如果是这样,您能提供任何指示或建议吗?

  2. 填充共享数据时,什么是好的更新策略?

非常感谢!

【问题讨论】:

  • Redis 在内存中,所以速度很快,“冲突”的可能性更小,但是,在我看来,如果你不想要意外的结果,你仍然需要管理某种队列
  • 好的,您能详细说明一下吗? “意想不到的结果”是什么意思?当您说队列时,您的意思是使用它作为数据结构来存储我们要获取的元素?
  • 不,我又读了一遍,你不介意随机结果。我想那没有问题。也就是说,没有队列...
  • 您可能对PGQ“实时交易的异步批处理”感兴趣。
  • 谢谢,但我认为该用例不适合 PGQ(即合作消费者,而不是广播“听众”)。不过,很棒的建议。

标签: postgresql asynchronous redis queue distributed-computing


【解决方案1】:

不是一个完整的答案,只是一些想法: 就像有人说的那样,Redis 将您的集合保存在内存中,因此为了回答 1,您需要考虑或至少估计最坏的情况:

  • 集合中的每个元素需要多少内存空间
  • 有多少(数量)元素是非常重的负载

一旦你有了估计,你就可以计算并看看使用 Redis 是否可行:

例如,拥有 100 字节的元素并期望 1.000.000 个元素的“非常重”负载,您将需要至少 100MB 的内存仅用于 Redis,并且使用它是可行的,甚至是便宜的。但是如果您每个元素需要 500 个字节,而您的重负载意味着 30.000.000 个元素,那么您需要 15GB 的内存,与使用您的 postgre 数据库相比,它甚至是可行的,但可能过于昂贵,这导致您需要进行第二次估计:

  • 您对 Redis/Postgre 服务器的请求数/秒(总共),或者您希望发出请求的进程数以及每个进程将发出的数/秒数。

进行一些估算可以帮助您确定最适合您的需求/预算的解决方案。

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多