使用任意编程语言为nginx扩展高性能逻辑( 二 )


该格式可以是任何序列化格式 , 例如json、yaml , 只要它与运行时匹配 。
 

  • 运行时
 
库和配置的组合将引入一个新的运行时 , 该运行时代表一些线程或用于执行作业的协程 。
您可以使用具有不同配置的同一库 , 这非常常见 , 特别是对于Java和Python 。
 
  • 请求响应模式
 
Nginx工作进程和运行时之间的耦合基于消息交换 , 其中包含两个方向:
1 , 请求
Lua协程创造了一项任务
将任务与请求消息相关联 , 即C malloc()字符数组 。请注意 , 这个字符数组将由lua-resty-ffi释放 , 运行时只是使用它 。
将任务放入运行时的线程安全队列并生成
运行时轮询此队列
为什么不调用其他语言提供的API?
在Go中 , 由于GMP模型 , 它可能会阻止nginx工作进程
它增加了其他语言提供此类API的负担
2 , 回应
运行时将响应(也称为C malloc()字符数组)直接注入ngx_thread_pool_done队列 , 并通过eventfd通知nginx epoll循环 , 然后nginx将恢复lua协程 。请注意 , lua-resty-ffi将释放响应 , 因此在您的运行时无需关心它 。
?压测
和unix socket domain 对比性能报告如下
使用任意编程语言为nginx扩展高性能逻辑

文章插图
 
使用任意编程语言为nginx扩展高性能逻辑

文章插图
 
?总结
从事nginx扩展开发的同学可以关注下这个扩展库 , 它开放了一种多语言模型 , 提供了灵活的扩展方式和nginx高性能模型进行配合 。
项目地址:https://github.com/kingluo/lua-resty-ffi

【使用任意编程语言为nginx扩展高性能逻辑】


推荐阅读