【问题标题】:Why does Django fail when Memcached goes down?为什么当 Memcached 宕机时 Django 会失败?
【发布时间】:2012-09-04 08:53:28
【问题描述】:

我正在运行一个 Django 1.3 实例,它带有一个用于缓存层的 memcached 后端,最近我一直在尝试为应用程序调试数据库的一部分,但是每当我将 memcached 服务器脱机时,我都会得到以下信息错误:

AttributeError at /joinerysoft/contacts/ajax/all/None/None/
'NoneType' object has no attribute 'sendall'
Request Method: GET
Request URL:    http://joinerysoft-directory.co.uk/joinerysoft/contacts/ajax/all/None/None/
Django Version: 1.3.1
Exception Type: AttributeError
Exception Value:    'NoneType' object has no attribute 'sendall'
Exception Location: /usr/lib/python2.7/dist-packages/memcache.py in send_cmd, line 1112
Python Executable:  /usr/bin/python
Python Version: 2.7.3

我认为 memcached + django 的吸引人之处在于,如果 memcache 消失,您的网站在返回之前仍然可以运行(尽管已经瘫痪)。我确实使用 Django 的内置缓存。

【问题讨论】:

    标签: django


    【解决方案1】:

    首先,这不是 Django 的错误,而是 python-memcached 库的错误。 其次,我认为这种行为是一致的。如果您将 Django 配置为使用 memcached 并且它出现故障,那么它应该会抛出一个错误!假设您的网站严重依赖缓存,您还想尽快知道是否发生了什么事情,而不是在几天后发现您的整个数据库也已关闭,因为那里有太多的查询(例如)。

    有一些方法可以定义回退缓存或执行其他解决方法。看看这个类似的问题:Is there a way to ignore Cache errors in Django?

    【讨论】:

    • 所以它应该完全删除服务,而不是优雅地降级?在我看来,那是糟糕的设计。当然,您想知道您的 memcached 服务器都已关闭,并且您仅在 DB 上运行,但是通过错误日志机制而不是向用户输出错误不是更好
    • @Jharwood 我认为您始终可以构建一个可以优雅地处理这些错误的包装器。
    • 是的,你说得对,应该在底层库中处理它。无论如何,它至少应该给你一个警告(不一定是错误),所以你可以配置 Django 将这些警告转发给你。
    • 所以这意味着每当我们使用缓存时,我们就应该 100% 依赖它?那叫“缓存”有什么用呢,不是说没有“缓存”应该没问题,为什么会阻塞,导致一切出错?
    • 如果你使用数据库,你也依赖它。如果数据库出现故障,您的应用程序很可能也会失败,除非您围绕它构建错误处理程序,这将使您的应用程序正常失败。缓存后端只是另一个第三方数据存储。如果您不想 100% 依赖,他们会将其构建到您的应用程序中,但不需要库或工具本身来为您处理。同样,我认为最好有明确的错误,然后相应地处理它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2020-10-08
    相关资源
    最近更新 更多