Heroku - Redis 内存 > 'maxmemory' 在 hobby:dev 中有一个 20MB 的文件,它应该是 25MB

Heroku - Redis memory > 'maxmemory' with a 20MB file in hobby:dev where it should be 25MB

因此,我正在尝试在我的 Heroku 网站上使用使用 Redis 的 Celery 上传一个文件。我正在尝试上传大小为 20MB.exe 类型的文件。 Heroku 在 they're hobby: dev 部分说可以上传的最大内存是 25MB。但是我试图在 Celery 中上传文件(将其从字节转换为 base64,对其进行解码并将其发送到函数)出现 kombu.exceptions.OperationalError: OOM command not allowed when used memory > 'maxmemory'. 错误。请记住,当我尝试上传 5MB 文件时,它工作正常。但是 20MB 没有。我正在使用 Python 和 Flask 框架

在DB中存储文件有两种方式(Redis只是一个内存DB)。您可以在数据库中存储一个 blob(对于小文件,比如几 KB),或者您可以将文件存储在内存中并在数据库中存储指向该文件的指针。

因此对于您的情况,将文件存储在磁盘上并仅将文件指针放在数据库中。

这里要注意的是,Heroku 有一个 Ephemeral file system 每 24 小时或每当您部署新版本的应用程序时就会被删除。

所以你必须这样做:

  1. 写一个小函数将文件存储到本地磁盘(这是临时存储)和return文件的路径
  2. 使用文件路径向 Celery 添加任务,即 Celery 任务的参数将是 "file-path" 而不是 20MB 数据的序列化 blob。
  3. Celery 工作进程在空闲时选择您刚入队的任务并执行它。

如果您稍后需要访问该文件,并且由于本地 heroku 磁盘只有临时文件,您必须将文件放在一些永久性存储中,例如 AWS S3。

(我们经历所有这些环节而不是将文件直接放在 S3 中的原因是因为访问本地磁盘很快,而 S3 磁盘可能位于其他位置的其他服务器场中,并且需要时间来保存那里的文件。如果您尝试在主进程中将文件写入 S3,您的 Web 进程可能会出现 slow/stuck。)