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

2024-05-28 14:12:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用两个dynos(web和worker)。web使用flask应用程序处理请求。worker运行基本python代码,每5分钟输出一个.csv文件。此文件非常小(<;1MB)。flask应用程序应该读取此.csv文件,该文件是服务请求所必需的。问题是:最有效的方法是什么?据我所知,dynos是相互隔离的。其次,heroku有一个短暂的文件系统(这对我的应用程序来说是可以的),因为.csv文件不需要在重启之间持久存在。此外,它们不需要备份。工作进程写入的.csv文件在ls输出中不可见(在执行heroku run bash之后)。这很可能是因为web和worker彼此隔离。在花了一些时间在网上研究这些选项之后,我认为有三种选择:

(1)使用AWS S3:这是活动文件的一个好选项吗?这些文件应该以频率写入和读取-对于我的应用程序来说,S3会很慢。其次,我想从python代码中编写(并读回)。我不知道如何使用S3实现这一点。S3似乎是应用程序所需的静态文件的存储

(2)Postgres:工作人员和web是否共享此存储?是否可以将.csv文件写入此文件,或者它必须是SQL

(3)Redis:我不明白这一点。它使用队列在动态对象之间进行通信。它可以用来传递数据吗

我的flask应用程序只有在前端收到请求时才能读取文件。不确定Reddis队列如何对此有所帮助

谢谢


Tags: 文件csv方法代码ltweb应用程序flask
1条回答
网友
1楼 · 发布于 2024-05-28 14:12:32

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中进行复杂的缓存

相关问题 更多 >

    热门问题