如何在多个进程之间共享一组数据?

9
我们需要建立一个系统,使多个进程可以在同一数据集上工作。该想法是拥有一组元素(即没有重复值),可以由我们的工作进程(异步方式)获取。这些进程可能分布在几台服务器上,因此我们需要一个分布式解决方案。
目前,我们考虑使用 Redis 来保存集合,其中保存着工作数据。每个进程应连接到该集合,并从中弹出一个值。`spop` 函数的随机功能实际上对我们来说是一个优点,因为我们需要随机访问集合中的元素。数据需要从我们的主 PostgreSQL 数据库进行填充。
正如我所说的,我们还可以查询可用的 PostgreSQL 数据库,进程可以在请求元素时访问它。但是,我们不知道在重载情况下是否会成为瓶颈。我们预计这个子系统将会有大量 - 非常大量的并发访问(考虑到数百甚至数千个进程)。
如果这与任何相关信息有关,我们正在使用 Python 和 `rQ` 来处理异步任务(作业和工作进程)。
编辑:就大小而言,元素不应很大 - 最大大小应该在 500-1000 字节左右。它们基本上都是 URL,因此除非发生奇怪的事情,否则它们应该远远小于该大小。元素数量将取决于并发进程的数量,因此大约 10-50K 元素可能是一个很好的基准。请记住,这更像是一个分段区域,因此应该关注速度而不是大小。
我的问题总结如下:
1. 当使用多个进程时,Redis 集合是否是共享访问的好方法?有哪些数据可以告诉我们该解决方案的规模?如果可以,请提供指针或建议。 2. 填充共享数据时,什么是一个好的更新策略?
非常感谢!

Redis是内存数据库,因此速度快,冲突的可能性较小,但如果不想出现意外结果,似乎仍需要管理某种类型的队列。 - Itay Moav -Malimovka
好的,您能详细说明一下吗?"意外结果"是什么意思?当您说队列时,您是指将其用作存储我们想要获取的元素的数据结构吗? - Juan Carlos Coto
我再次阅读了一下,看到您并不介意随机结果。那么我猜就没有问题了。也就是说,没有队列... - Itay Moav -Malimovka
你可能会对PGQ感兴趣,它可以实现“异步批处理实时事务”。 - Erwin Brandstetter
谢谢,但我认为这个使用案例不适合PGQ(即合作消费者,而不是广播“听众”)。不过是个好建议。 - Juan Carlos Coto
1个回答

3
并不是完整的答案,只是一些想法:就像之前所说的那样,Redis在内存中维护您的集合,因此要回答问题1,您需要考虑或至少估计一个最坏情况:
- 您需要为集合中的每个元素使用多少内存空间 - 多少(数量)元素会非常重?
一旦您有了一个估计值,您可以计算并查看是否可行使用Redis:
例如,如果每个元素的大小为100字节,并且期望“非常重”的负载为1,000,000个元素,则仅对于Redis,您将需要至少100MB的内存,这是可行的,甚至便宜。 但是,如果您需要每个元素500字节,并且您的重负载意味着30,000,000个元素,则需要15GB的内存,这也是可以做到的,但与使用postgre数据库相比可能太昂贵,这导致您需要进行第二次估计:
您预计针对Redis / Postgre服务器有多少请求/秒(总共),或者预计有多少进程正在发出请求,每个进程将每秒发出多少个请求。
拥有一些估计值可以帮助您决定哪种解决方案最适合您的要求/预算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接