基于之前对于clip-as-service的调研,我在官方文档中看到横向扩展页面中的副本相关内容,可以解决并发问题,于是动手验证了一番
参考链接
(官方文档)link
官方文档的描述
首先我整了一个服务端
如果需要开启副本,就创建这样的flow后启动server程序
f = Flow(protocol=‘http’,port=12345).add(name=‘myexec1’, uses=MyExecutor, replicas=5)
如果不开启副本,就创建这样的flow之后再启动程序
f = Flow(protocol=‘http’,port=12345).add(name=‘myexec1’, uses=MyExecutor)
from jina import Flow, Executor, requests
import time
class MyExecutor(Executor):
@requests(on='/bar')
def foo(self, **kwargs):
time.sleep(2)
if __name__ == '__main__':
# f = Flow(protocol='http',port=12345).add(name='myexec1', uses=MyExecutor, replicas=5)
f = Flow(protocol='http',port=12345).add(name='myexec1', uses=MyExecutor)
with f:
print(f.is_flow_ready())
f.block()
把服务端跑起来,输出如下
不开启副本的拓扑图如下
开启副本之后的拓扑图如下
第一个客户端
from jina import Client, Document
import time
c = Client(protocol='http',port=12345)
time1 = time.time()
c.post(on='/bar')
c.post(on='/bar')
c.post(on='/bar')
# 此处复制调用多个c.post(on='/bar'),为了便于观看
c.post(on='/bar')
time2 = time.time()
print(time2-time1)
再来一个客户端
from jina import Client, Document
import time
c = Client(protocol='http',port=12345)
time1 = time.time()
c.post(on='/bar')
c.post(on='/bar')
time2 = time.time()
print(time2-time1)
同一个客户端调用多次是否每次调用由不同的executor执行
这个我暂时没有在官方文档上找到区分副本的方法,所以还无法验证,等我问一下工作人员再进行补充
不同客户端调用时间分析
每一个executor我设置都要睡眠2s
在不开启副本的情况下测试
调用客户端 | 调用次数 | 是否开启副本 | 消耗时间 |
---|---|---|---|
1 | 65次 | 是 | 150s |
2 | 2次 | 是 | 6s |
在开启5个副本的情况下测试
调用客户端 | 调用次数 | 是否开启副本 | 消耗时间 |
---|---|---|---|
1 | 65次 | 是 | 133s |
2 | 2次 | 是 | 4s |
由此可见,不同客户端在发送请求时,flow会把不同客户端的请求分配到不同的executor上面,如果A要调用1000次,B要调用2次,B的执行速度不会受到A客户端的影响