如何在Web和Heroku上的工作程序不同的dynos之间通信数据使用python?

问题描述

我正在使用两个测功机(网络和工作程序)。 Web使用Flask应用处理请求。 worker运行基本的python代码,每5分钟输出一个.csv文件。该文件非常小(ls输出中(执行heroku run bash之后不可见)。这很可能是因为网络和工作人员相互隔离。在花了一些时间在线研究这些选项之后,我认为有三种选择:

(1)使用AWS S3:这对于 active 文件一个不错的选择吗?应该以 high 的频率读写文件-对于我的应用程序S3不会很慢。其次,我想从python代码中编写(和读回)。我不确定如何使用S3执行此操作。看来S3可以存储您的应用程序所需的静态文件

(2)Postgres:工作者和Web共享此存储吗?可以向其中写入.csv文件,还是必须使用sql

(3)Redis:我不明白这一点。它使用队列在测功机之间进行通信。可以用来传达数据吗?

仅在前端发出请求时,我的flask应用程序才必须读取文件。不确定Reddis队列如何帮助您。

谢谢。

解决方法

redis当然具有良好的排队功能。但从本质上讲,它是一个远程词典服务,因此得名。

您的工作人员可以PUT将该csv文件转换为redis,而您的Web dyno可以检索它。

r.set('csv',serialized_data);

将其放置在那里,

serialized_data = r.get('csv'); 

找回它。 'csv'是redis键 。在heroku redis服务的限制内,您可以拥有任意数量的密钥(更多的密钥,更多的数据,更高的成本)。

redis的效率足够高,您的Web dyno可以在每次需要时get()进行数据处理。它将始终获取最新的数据(除非工作人员在启动时尚未第一次将其放到那里)。除非您的负载很高,否则无需在Web dyno中进行复杂的缓存。