对接第三方SDK时,比如MongoDB/Redis/MySQL服务器时,当作对接的前端使用。他最重要的是封装了一个阻塞请求接口,这个请求接口会阻塞,直到服务器做出对应的响应,然后解包,唤醒挂起协程并返回数据。Mongodb交互协议使用请求ID模式。 Redis和Mysql使用有序请求-回应模式,即不需要会话ID。
创建频道对象:
local socketchannel = require "skynet.socketchannel" local channel = socketchannel.channel { host = "127.0.0.1", port = "8001", response = dispatch, nodelay = true, auth = mongo_auth(obj), backup = serverlist, overload = overload_warn_cb }
host
: 指定连接的服务器IPport
: 指定连接的服务器端口response
: 可选参数。当指定时,表示和服务器交互使用的是带会话ID的,可同时并行多个会话协议(session mode)。同时要求dispatch
函数返回request_id, is_succ, data
形式。根据request_id
来唤醒对应本请求而导致阻塞的请求协程。当is_succ
为false
表示数据非法要断开连接, 也会被阻塞的协程。nodelay
: 连接套接字使用nodelayauth
: 认证回调函数。backup
:当服务器有主从等多个节点时,这里给出每个节点的host
,port
,以备切换节点连接overload
: 当连接的套接字的发送缓存过大时告警回调。连接服务器:
channel:connect(once)
once
是否尝试连接一次。如果不传递或者为false
表示会不断重连。每次连接时,主要当前主节点连接失败则会连接其他节点。每当套接字连接成功时,本模块都会启动一个收数据用的dispatch_by_xxx新协程,循环调用
response
解包函数。而解包函数一般都会调用套接字的read
类型函数,于是进行循环收数据逻辑。发起请求:
channel:request(pack, request_id)
本接口会首先检测是否已经连接上服务器,如果连接是关闭的或者还没有连接,会先连接服务器。然后本协程发送请求数据,最后挂起本协程。当收数据协程,收到对应请求ID时,唤醒本协程并把解包后数据当作本接口的返回值。
pack
: 请求数据request_id
: 本次请求ID, 如果不是session模式,这个参数就是接受返回数据的回调。关闭连接
channel:close()
虽然在服务退出时也会关闭,但也支持显示关闭。
无请求时主动接收数据。一般配合顺序模式下使用。
channel:response(response)
response
是一个函数,用于收解包。返回解包后数据。在MySQL和Redis接口中都有使用。设置后备节点列表
channel:changebackup(backup)
在MongoDB接口中使用,用于设置节点列表。
修改使用的节点
channel:changehost(host, port)
在MongoDB接口中使用,当连接建立后进行认证后调用,会导致当前套接字关闭,中断当前所有请求。当有新请求时会,切换为新节点。
评论 (0)