【问题标题】:How to communicate data between web and worker (different dynos) on Heroku (using python)?如何在 Heroku(使用 python)上的 web 和 worker(不同的 dynos)之间通信数据?
【发布时间】:2021-02-02 18:23:11
【问题描述】:

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

(1) 使用 AWS S3:这是 active 文件的好选择吗?这些文件应该以 high 频率写入和读取 - S3 对我的应用程序来说不会很慢。其次,我想从 python 代码中编写(并读回)。我不确定如何使用 S3 执行此操作。 S3 似乎是您的应用程序需要的静态文件的存储。

(2) Postgres:worker 和 web 共享这个存储吗?可以为此写一个 .csv 文件还是必须是 SQL?

(3) Redis:这个我不明白。它是使用队列在测功机之间进行通信的东西。可以用来传递数据吗?

只有当前端有请求时,我的烧瓶应用程序才必须读取文件。不确定 Reddis 队列对此有何帮助。

谢谢。

【问题讨论】:

    标签: python postgresql amazon-s3 heroku redis


    【解决方案1】:

    redis 当然有很好的队列特性。但它的核心是一个远程字典服务,因此得名。

    您的工作人员可以PUT 将该 csv 文件输入到 redis 中,您的 web dyno 可以检索它。

    r.set('csv', serialized_data);
    

    把它放在那里,然后

    serialized_data = r.get('csv'); 
    

    把它拿回来。 'csv' 是 redis key。在 heroku redis 服务的限制范围内,您可以拥有任意数量的密钥(更多密钥、更多数据、更高成本)。

    redis 足够高效,您的 web dyno 每次需要数据时只需 get() 即可。它总是会得到最新的数据(除非工作人员在启动时第一次没有把它放在那里)。除非您的负载非常高,否则无需在您的 Web dyno 中进行精细的缓存。

    【讨论】:

    • 感谢您的指点。理想情况下,我想将 csv 作为熊猫数据框传递。显然有一种方法可以使用 pyarrow 来做到这一点。 link
    • 是的,完美。这种序列化正是你想要的。
    • 我可以使用第一条评论中链接中的信息序列化和反序列化熊猫数据框。但是我仍在寻找使用 Postgres 或 S3 的解决方案。谢谢。
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2013-04-28
    • 2012-02-29
    • 2016-06-07
    相关资源
    最近更新 更多