【问题标题】:Flask / Heroku / Redis / RQ Internal Server ErrorFlask / Heroku / Redis / RQ 内部服务器错误
【发布时间】:2023-03-14 21:35:01
【问题描述】:

我有一个推荐网站。一切都很顺利,直到网站流量相当大的时候,建议将花费超过 30 秒(Heroku 的限制)和超时,引发 500 错误。我意识到这对于 http 请求来说是一个很长的时间。

所以,我上网阅读并使用 Redis 实现了 RQ。我得到了它的工作,但经过一些测试,它仍然会抛出内部服务器错误,即使请求正在通过队列。

我真的只是在这里缺乏知识,我不知道该怎么办。我想我想念 rq 和 redis 的整个想法?这是我的一些代码,如果它有帮助的话,但我希望能提供更多关于从这里去哪里修复这个错误的指导。

worker.py

import os
import redis
from rq import Worker, Queue, Connection

listen = ['high', 'default', 'low']

redis_url = os.getenv('REDISTOGO_URL',
                      'redis://redistogo:sampleurl:portNo/')
if not redis_url:
    raise RuntimeError('Set up Redis to go first.')

conn = redis.from_url(redis_url)

if __name__=='__main__':
    with Connection(conn):
        worker = Worker(map(Queue, listen))
        worker.work()

我的部分观点.py

q = Queue(connection=conn)

@app.route('/')
def home():
    form = ArtistsForm()
    return render_template('home.html', form=form)


@app.route('/results', methods=['POST'])
def results():
    form = ArtistsForm()
    error = None
    try:
        if request.method == 'POST' and form.validate():
            table = 'Artists'
            artists = []
            for value in form.data.items():
                if (value[1] is not ''):
                    artists.append(value[1])

            results = q.enqueue_call(func=getArtists, args=(table, *artists))
            while results.result is None:
                time.sleep(1)
            results = results.result.values.tolist()

            return render_template('results.html', results=results)
        else:
            error = "Please be sure to enter 5 artists with correct spelling" \
                    " and punctuation"

    except pylast.WSError:
        return render_template('error.html')
    return render_template('home.html', form=form, error=error)

感谢任何指导

【问题讨论】:

  • 什么是错误信息?
  • 只有500个内部服务器。在 Heroku 日志上,它是 H12 - Timeout(因为请求需要超过 30 秒)
  • 本地/开发环境没有错误吗?
  • 不,它在本地运行良好。就像我说的那样,当网站上有流量时,就会出现这种情况。请求和计算运行时间更长,导致超时错误。我正在尝试做的是找到一种方法来防止超时错误,这种错误时不时发生。
  • 也许,你需要升级你的 Redis 计划。 :-/

标签: python heroku flask redis


【解决方案1】:

您总是可以尝试在 web dyno 之间划分工作以简单地确认请求,然后让 worker dyno 完成繁重的工作。

Kafka 或类似的东西可以用来完成这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    相关资源
    最近更新 更多