基于RESTful API的系统的架构决策和错误处理(使用nginx + redis)

时间:2015-01-02 13:57:54

标签: nginx redis restful-architecture

我是在HTTP上开发RESTful API的新手,所以这就是为什么我有一些基本的架构问题。为简单起见,我将认证留在等式之外。

RESTful API应由nginx(在反向代理配置中)和Redis处理。某些HTTP请求/响应可能在HTTP正文中使用JSON。

从消息传递的角度来看,我想要实现的目标是:

1.(客户端 - > nginx)通过HTTP对nginx进行RESTful API请求。

2.(nginx - > Redis)nginx将API请求传递给Redis并发出"发布newRequest",之后nginx将等待Redis的响应(使用nginx第三方Redis模块)。
  2.1我不太确定以上等待Redis"的响应。将实际实施。然而,我可以考虑订阅Redis活动,该活动将由我的自定义Redis"应用程序" (请参阅下文),请求一经处理。你可能知道更好的方法吗?

3.(Redis - > Redis"应用")(上面发布的)" newRequest"将唤醒其Redis用户,这是一个Redis"应用程序" (基于Redis C ++客户端的自定义C ++代码)。

4.(Redis"应用程序" - > Redis - > nginx - >客户端)Redis"应用程序"将处理该请求,之后将发布响应(用于唤醒Redis订阅者 - 从2.1-然后将"响应"传递回nginx,最后传递给原始呼叫者)
  4.1现在..我的Redis"应用程序"可能会失败,所以我想将这些错误传回原始调用者(使用HTTP响应错误代码+附加的一些描述性JSON)。但是从我的Redis"应用程序"我无法控制HTTP响应错误代码(这由nginx管理)。那么我想知道一下......如何/在哪里可以更好地实现错误处理,这样我的Redis"应用程序"将驱动错误处理,而不必为我在Redis"应用程序"中添加的每个新错误更新nginx配置?

提前感谢您的支持!

祝你好运

1 个答案:

答案 0 :(得分:1)

所有的知识(对我来说)nginx第三方Redis模块通常使用基本的请求/响应协议,而不是长期的Pub / Sub。所有这些都使用主要的nginx功能之一 - 上游服务器的异步子请求。异步意味着工作进程在响应到达之前不会阻塞,但会继续处理来自客户端的其他请求和来自上游服务器的响应。

Here很好地概述了nginx功能。

您对" Redis Application"的想法对我来说看起来有点奇怪而且多余。

使用redis2-nginx-module,使用Redis作为存储,nginx conf文件处理RESTful API的可能性非常有限。最受欢迎的用法 - 只是页面缓存。

但是你可以在Redis方面使用EVAL命令做一些聪明的事情。不是我喜欢的方式。

我建议使用完美的OpenResty套装。 在LuaNginxModule和LuaRestyRedis的帮助下,您可以在nginx中实现任何智能逻辑并使用Redis作为存储。使用LuaRestyRedis模块,您将能够编写非常简单但仍然高效的代码,以异步方式处理对Redis的子请求。在处理一个RESTFul请求时,您甚至可以并行或顺序向Redis发出多个子请求。

它还有一个带有JSON解析和编码支持的LuaCjson模块。

管道将更加简单: 客户< - > nginx< - > Redis