【发布时间】:2016-10-16 11:03:44
【问题描述】:
我阅读了this 的问题,但它并没有真正帮助。
首先也是最重要的事情:时间性能是我正在开发的应用程序的重点
我们有一个客户端/服务器模型(如果我们愿意,甚至可以是分布式或云)和一个托管在服务器上的数据结构 D。每个客户端请求包括:
- 从
D读到一些东西 -
最终在
D上写点东西 -
最终删除
D上的某些内容
我们可以说,在这个应用程序中,接收到的操作数之间的关系可以描述为delete<<write<<read。另外:
- 读取操作不能绝对等待:它们必须立即处理
- 写入和删除可以等待一段时间,但越快越好。
根据上面的描述,任何锁机制都是不可接受的:这意味着读取操作可以等待,这是不可以接受的(对不起,如果我强调这么多,但这真的很关键点)。
一致性不是必需的:如果执行了写入/删除操作,然后读取操作看不到写入/删除效果,这没什么大不了的。这会更好,但不是必需的。
解决方案应该是数据结构独立的,所以无论我们写在矢量、列表、地图还是唐纳德特朗普的脸上都无关紧要。
数据结构可能会占用大量内存。
到目前为止我的解决方案:
我们使用两台服务器:第一台服务器(称为f)具有Df,第二台服务器(称为s)已更新Ds。
f 使用Df 回答客户端请求,并将写入/删除操作发送到s。然后s 依次应用写/删除操作Ds。
在某个时刻,所有未来的客户端请求都会重定向到s。同时,f 将s 更新为Ds 到其Df。
现在,f 和 s 角色互换:s 将使用 Ds 回答客户请求,f 将保持 Ds 的更新版本。交换过程会定期重复。
请注意,为了简单起见,我故意省略了很多细节(例如,一旦交换完成,f 必须在应用从s 收到的写入/删除操作之前完成所有待处理的客户端请求与此同时)。
为什么我们需要两台服务器?因为数据结构可能太大而无法放入一个内存中。
现在,我的问题是:文学中有一些类似的方法吗?我在 10 分钟内想出了这个协议,我觉得奇怪的是没有(更好的)与这个类似的解决方案已经被提出!
PS:我可能忘记了一些应用程序规范,请随时要求澄清!
【问题讨论】:
标签: multithreading concurrency locking distributed lock-free