我正在设置c
服务器,并使用tarantool-c作为数据库使用tarantool。但是,每次我设置read_reply()
时,每秒的请求都会像使用mysql一样。如何解决?
答案 0 :(得分:1)
我们与James进行了讨论,他分享了code。该代码实现了http服务器,这就是它处理请求的方式:
问题的根源在于我们无法利用http服务器和tarantool之间的整个网络带宽。这样的服务器应该使用select()/ poll()/ epoll()(在Linux上)/ kqueue(在FreeBSD上)或libev之类的库来确定它是否能够写入套接字,从套接字读取或接受请求。
让我简单地描述一下when-X-then-Y规则集应如何操作(至少从一个线程使用网络时):
如果需要支持http keepalive /流水线,则服务器需要检查http客户端的套接字以准备执行read()/ write()。此外,它还需要注册未决的http响应,而不是在它们出现时立即写。
此外,HTTP本身不容易以适当的方式实现:如果您不控制客户端和服务器的实现,它总是会给您带来惊喜。
因此,我将介绍实现其自己的http服务器的替代方法,这些替代方法与tarantool兼容并且能够以异步方式与它进行操作以获得良好的性能。他们是:
这两种方式都有优点和缺点。但是,使用nginx作为将请求代理到tarantool的代理的前端可以克服http.server的缺点,从而节省http.server的优点。
http.server缺点:
http.server的优点:
nginx_upstream_tarantool的利弊与http.server的利弊相反。我还要特别提到,nginx允许您在多个tarantool实例之间平衡负载,这些实例可能形成复制组或正在分片前端。此功能可用于按期望的性能扩展服务,例如代理到http.server以及nginx_upstream_tarantool。
我想您也对http.server和nginx_upstream_tarantool的基准测试结果感兴趣。查看this测量。但是请注意,它是非常综合的:它执行小的请求并以小的响应进行回答。实际RPS编号可能会有所不同,具体取决于请求和响应的大小,硬件,是否需要https等。