如何在heroku上(使用python)在web和worker(不同的dynos)之间进行数据通信?

zbwhf8kr  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(328)

我正在使用两个dynos(web和worker)。web使用flask应用程序处理请求。worker运行基本的python代码,每5分钟输出一个.csv文件。此文件非常小(<1mb)。flask应用程序应该读取服务请求所需的.csv文件。问题是:最有效的方法是什么?据我所知,dynos是相互孤立的。其次,heroku有一个临时文件系统(这对我的应用程序来说是可以的),因为.csv文件不需要在重启之间持久存在。此外,它们不需要备份。工作进程写入的.csv文件在中不可见 ls 输出(执行后) heroku run bash ). 这很可能是因为web和worker是相互隔离的。在花了一些时间在网上研究这些选项之后,我认为有三种选择:
(1) 使用awss3:这对活动文件是一个好的选择吗?这些文件应该是以高频率写入和读取的-对我的应用程序来说不会太慢。其次,我想从python代码中编写(并读回)。我不知道如何使用s3。s3似乎是应用程序所需的静态文件的存储。
(2) postgres:worker和web共享这个存储吗?一个人可以写一个.csv文件到这个或者它必须是sql?
(3) 我不明白。它是一种使用队列在动态节点之间进行通信的东西。它能用来传递数据吗?
我的flask应用程序只有在从前端传入请求时才能读取文件。不确定reddis队列如何对此有所帮助。
谢谢。

ql3eal8s

ql3eal8s1#

redis当然有很好的排队特性。但它的核心是一个远程词典服务,因此得名。
你的工人可以 PUT 将csv文件导入redis,你的web dyno可以检索到它。

r.set('csv', serialized_data);

把它放在那里,然后

serialized_data = r.get('csv');

把它拿回来csv'是redis键。在heroku redis服务的限制范围内,您可以拥有任意数量的密钥(更多密钥、更多数据、更高成本)。
redis的效率足以让你的网络达人 get() 每次需要的时候都能得到数据。它将始终获取最新的数据(除非工作人员在启动时还没有第一次将其放在那里)。除非负载非常高,否则不需要在web dyno中进行复杂的缓存。

相关问题