Django -如何以最少的开销存储所有的请求/响应?

qojgxg4l  于 2022-11-18  发布在  Go
关注(0)|答案(2)|浏览(141)

我正在开发一个Django中间件来将所有的请求/响应存储在我的主数据库中(Postgres / SQLite)。但是不难猜到开销会很大,所以我想用Redis把请求排队一段时间,然后慢慢地把它们发送到我的数据库。例如,接收100个请求,把它们存储在数据库中,等待接收另外100个请求并执行相同的操作,或者类似的操作。
模型是这样的:

url
method
status
user
remote_ip
referer
user_agent
user_ip
metadata # any important piece of data related to request/response e.g. errors or ...
created_at
updated_at

我的问题是“这是一个好的方法吗?我们如何实施它?你有没有这样做的例子?”另一个问题是“有没有更好的解决方案”?

tpgth1q7

tpgth1q71#

不幸的是,这并不特别适合具体的问题/答案格式。
“这是一个好的方法吗?”很难直接回答"是“或”否“。它会 * 工作 *,你提议的实现看起来很合理,但你将实现相当多的软件,并给你的项目增加相当多的复杂性。
如果没有只有你自己拥有的上下文,这是否可取并不容易回答。
有些事情你需要回答:

  • 我如何处理这些存储的请求?调试?提供审计跟踪?
  • 如果是为了调试,那么数据库记录能给我们带来什么,而Web服务器的请求日志却不能?
  • 如果是审计跟踪,那么每个单独的HTTP请求都是审计跟踪的最佳表示吗?审计人员是否关心有人请求/favicon.ico?它是否传达了他们所需要的含义和上下文?
  • 我们是否一定要存储每个请求?存储多长时间?我们如何处理超出存储预算的情况?我们如何处理一些边缘情况,例如客户端在得到响应之前挂起,或者我们已经处理了请求,但在发送响应或记录记录之前崩溃?
  • 在带内记录请求和请求本身是否会带来我们实际上无法承受的性能成本?

比较您的方法与其他方法的优缺点:

  • 我们可以依赖Web服务器的日志,我们已经为此付出了代价,而且它是为处理这里的许多古怪情况而构建的。
  • 我们可以使用一个简单的中间件函数在请求的带内编写HTTPLog模型,这可以解决一些复杂的问题,比如“如果redis宕机了,而django和数据库没有宕机怎么办?”
  • 我们通过提供带外进程所需的任何上下文(可能通过信号或redis+celery)来编写审计日志系统

最重要的是:首先捕获您的实际需求,其次实现最简单的解决方案,只有在您实际看到性能问题之后才进行优化。

sxissh06

sxissh062#

我不会把这个功能放在我的Django应用程序中。有很多工具可以做到这一点。其中之一是NGINX,它是一个反向代理服务器,你可以把它放在Django的前面。然后你可以使用NGINX的access log。另外,你可以根据自己的需要使用format those logs。通常对于这么大的数据量,最好不要把它们存储在数据库中。因为这些数据很少被使用,您可以将它们存储在一个S3存储桶中,或者只存储在普通文件中,然后使用日志解析器工具来解析它们。

相关问题