超时管理器如何实现超时管理

超时管理器,用于实现请求回包超时回调处理。每一个请求发送给下游RPC-server,会在上下文管理器中保存req-id与上下文的信息,上下文中保存了请求很多相关信息,例如req-id,回包回调,超时回调,发送时间等。 超时管理器启动timer对上下文管理器中的context进行扫描,看上下文中请求发送时间是否过长,如果过长,就不再等待回包,直接超时回调,推动业务流程继续往下走,并将上下文删除掉。 如果超时回调执行后,正常的回包又到达,通过req-id在上下文管理器里找不到上下文,就直接将请求丢弃。画外音:因为已经超时处理了,无法恢复上下文。 无论如何,异步回调和同步回调相比,除了序列化组件和连接池组件,会多出上下文管理器,超时管理器,下游收发队列,下游收发线程等组件,并且对调用方的调用习惯有影响。画外音:编程习惯,由同步变为了回调。 异步回调能提高系统整体的吞吐量,具体使用哪种方式实现RPC-client,可以结合业务场景来选取。

July 10, 2019 · 1 min · jiezi

pymong 游标超时:pymongo.errors.CursorNotFound: Cursor not found

前言从库批量抽取数据或数据集较大后续代码运行时间太长而导致游标超时运行env:python2.7pymongo==3.7.0mongodb:v3.6.6解决方案:设置连接永远不超时 client=pymongo.MongoClient(host=‘s3005.test.com’,port=3005, connect=False) db = client.test col =db.images_new cursor = readm_col.find({“image_cover”: 1},no_cursor_timeout=True) ## no_cursor_timeout设置连接永远不超时 try for data in cursor: pass ## 一些业务逻辑 except: errinfo = sys.exc_info() print errinfo finally: cursor.close() ## 手动关闭连接,释放资源Done

March 12, 2019 · 1 min · jiezi