我需要构建一个 REST API/服务器,它在 80 毫秒内每秒响应超过 HTTP GET 15,000 个请求。如有必要,我可以使用负载均衡器运行多个实例。
服务器收到一个带有标准列表(大约 20 个)的请求,它们需要被解析并与一个规则集(大约 2000 个规则对所有 20 个标准具有不同的值和一个最终决定)进行比较,该规则集决定响应(是或否)。
示例请求有效负载:
{"Country" : "DE",
"ID" : "998423-423432-4234234-234234",
"Criteria1": "8748r78",
"Criteria2": "Some String",
[...]
}
示例规则集(仍有待决定,但让我们从一个简单的设计开始):
+--------+---------+-------------+--------------+
| RuleId | Country | Criteria1 | Criteria2 | etc...
+--------+---------+-------------+--------------+
| 1 | UK | SomeString1 | SomeString3 |
| 2 | UK | SomeString1 | SomeString2 |
| 3 | US | SomeString4 | * (Wildcard) |
+--------+---------+-------------+--------------+
每个标准可以包含 1 到大约 400 个不同的值,所有字符串(例如 ISO 代码中的 GEO)。有些可能为空并被视为通配符。理论上可能存在所有 20 个标准具有相同值的条目,但这是尚未编写的规则引擎要整理的主题。
我做了一些研究如何实现这一目标:
- 使用 sanic 作为高吞吐量的网络服务器,根据我的研究,这是除了 alpha 的 japronto 之外的 python 最快的;编辑:有没有人对类似用例的基于 python 的 webserver+webframework 的性能有经验?我只阅读通常有一个非常简单的测试用例的基准(只需对请求响应一个固定字符串,因此在所有基准中每秒可能的请求数很高)
- 使用 sqlite3(在内存中)进行规则查找;不确定具有 20 个约束的 SQL 语句是否足够快?也许还有另一种方法可以将每个请求与超过 20 个标准的规则集进行比较(每个标准都是一个字符串比较)。编辑:感谢评论者,我可能会将规则预先计算为散列并使用散列进行查找,因此不需要用于实时查找的数据库。
- 使用 redis 或其他数据库来存储预先计算的规则(这是另一个主题),并使它们准备好加载到 http 服务器的每个实例/worker 中,从而加载到 sqlite3 数据库中。
- 也许使用 pypy3 来提高速度,但我没有使用 pypy 的经验
我会在 Heroku 上主持这个。
所以问题是:哪些库和架构允许使用 python 实现这种速度?