标签搜索

skynet中socketchannel的使用

anker
2021-06-27 / 0 评论 / 99 阅读 / 正在检测是否收录...

对接第三方SDK时,比如MongoDB/Redis/MySQL服务器时,当作对接的前端使用。他最重要的是封装了一个阻塞请求接口,这个请求接口会阻塞,直到服务器做出对应的响应,然后解包,唤醒挂起协程并返回数据。Mongodb交互协议使用请求ID模式。 Redis和Mysql使用有序请求-回应模式,即不需要会话ID。

  1. 创建频道对象:

    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: 指定连接的服务器IP

    port: 指定连接的服务器端口

    response: 可选参数。当指定时,表示和服务器交互使用的是带会话ID的,可同时并行多个会话协议(session mode)。同时要求dispatch函数返回request_id, is_succ, data 形式。根据request_id来唤醒对应本请求而导致阻塞的请求协程。当is_succfalse表示数据非法要断开连接, 也会被阻塞的协程。

    nodelay: 连接套接字使用nodelay

    auth: 认证回调函数。

    backup:当服务器有主从等多个节点时,这里给出每个节点的host,port,以备切换节点连接

    overload: 当连接的套接字的发送缓存过大时告警回调。

  2. 连接服务器:

    channel:connect(once)

    once 是否尝试连接一次。如果不传递或者为false表示会不断重连。每次连接时,主要当前主节点连接失败则会连接其他节点。

    每当套接字连接成功时,本模块都会启动一个收数据用的dispatch_by_xxx新协程,循环调用response解包函数。而解包函数一般都会调用套接字的read类型函数,于是进行循环收数据逻辑。

  3. 发起请求:

    channel:request(pack, request_id)

    本接口会首先检测是否已经连接上服务器,如果连接是关闭的或者还没有连接,会先连接服务器。然后本协程发送请求数据,最后挂起本协程。当收数据协程,收到对应请求ID时,唤醒本协程并把解包后数据当作本接口的返回值。

    pack: 请求数据

    request_id: 本次请求ID, 如果不是session模式,这个参数就是接受返回数据的回调。

  4. 关闭连接

    channel:close()

    虽然在服务退出时也会关闭,但也支持显示关闭。

  5. 无请求时主动接收数据。一般配合顺序模式下使用。

    channel:response(response)

    response是一个函数,用于收解包。返回解包后数据。在MySQL和Redis接口中都有使用。

  6. 设置后备节点列表

    channel:changebackup(backup)

    在MongoDB接口中使用,用于设置节点列表。

  7. 修改使用的节点

    channel:changehost(host, port)

    在MongoDB接口中使用,当连接建立后进行认证后调用,会导致当前套接字关闭,中断当前所有请求。当有新请求时会,切换为新节点。

0

评论 (0)

取消