我想刮掉大量的网页(1000 /秒)并将这些网页中的1-2个数字保存到数据库中。我想用RabbitMQ管理这个Worker,但我也必须在某处写数据。
Heroku PostgreSQL在其最便宜的生产层中具有60个请求的并发限制。 PostgreSQL是这项工作的最佳解决方案吗? 是否可以设置Postgres数据库在我的本地计算机上进行每秒1000次写入?
答案 0 :(得分:1)
是否可以设置Postgres数据库在我的本地计算机上进行每秒1000次写入?
试一试,看看。如果您有SSD,或者不需要安全性,那么您几乎可以肯定。
您会发现,选择任何时,您必须权衡持久性和写入延迟。
如果您想按照严格的顺序单独提交每条记录,您应该能够在具有不错SSD的笔记本电脑上实现这一目标。你不可能在廉价的AWS实例,带有旋转生锈硬盘的服务器等等上得到它,因为它们没有足够好的磁盘刷新率。 (pg_test_fsync
是查看此内容的便捷工具)。对于任何正在进行单个记录到持久存储的真正原子提交的事情都是如此,而不仅仅是PostgreSQL - 关于你将获得的最佳速率是最大磁盘刷新率/ 2,除非它是一个纯粹的附加系统,在哪种情况下,提交率可以等于磁盘刷新率。
如果要获得更高的吞吐量,则需要将批处理写入在一起并将它们分组提交以分散磁盘同步开销。对于PostgreSQL,commit_delay
选项可用于批量提交。更好的是,缓冲客户端的一些更改并执行多值插入。如果您不需要硬保证,则在关闭交易时关闭synchronous_commit
,然后再将控制权交还给您的计划。
我尚未对其进行测试,但希望Heroku允许您使用SET synchronous_commit = off
或SET commit_delay = ...
在会话中设置这两个参数。你应该测试一下然后看看。实际上,您应该进行模拟工作负载基准测试,看看是否可以使其足够快以满足您的需求。
如果你不能,你将能够使用具有适当配置的备用主机。
答案 1 :(得分:1)
PostgreSQL完全有能力处理这样的工作。为了给你一个想法,PostgreSQL 9.2预计会handle up to 14.000 writes per second,但这在很大程度上取决于你如何配置,设计和管理数据库,以及可用的硬件(磁盘性能,RAM等)。
我认为Heroku强加的限制是为了避免潜在的过载。您可能需要考虑在自定义服务器或替代解决方案上安装PostgreSQL。例如,亚马逊最近宣布支持PostgreSQL on RDS。
最后,我只想提一下,对于大多数标准任务而言,“最佳解决方案”在很大程度上取决于您的知识。有效配置的MySQL比配置错误的PostgreSQL更好,反之亦然。
我知道通过高度优化引擎的设置和配置,能够通过特定数据库达到意外结果的公司。确实存在例外情况,但我认为它们不适用于您的情况。