[skynet]关于cluster.send没反应

2022-03-22  本文已影响0人  吃豆腐不吐豆腐皮

问题代码如下:

local cluster = require "cluster"

skynet.start(function()
    cluster.send("my_cluster_server","@my_server","hi")
    skynet.exit()
end)

问题: 我这里碰到的情况是,如果第一次对cluster节点进行访问,不用call而是用send,那么cluster.lua中的sende是没有该地址的,需要等到对这个节点进行call的时候才会去获取,并且发送.
解决:在cluster.send之前先cluster.query一下,或者用其他的方式访问cluster的服务(参考我之前的文章).又或者直接改源码.


这里我们看下skynet的源码,看看他代码是怎么写的.

查看源码可知,当目标节点没找到时,会放在task_queue队列里,等下一次cluster.call的时候,再去获取,代码如下

function cluster.send(node, address, ...)
    -- push is the same with req, but no response
    local s = sender[node]
    if not s then
        table.insert(task_queue[node], table.pack(address, ...)) --就是这句
    else
        skynet.send(sender[node], "lua", "push", address, skynet.pack(...))
    end
end

再来看cluster.call

function cluster.call(node, address, ...)
    -- skynet.pack(...) will free by cluster.core.packrequest
    return skynet.call(get_sender(node), "lua", "req",  address, skynet.pack(...))
end

这里的重点就是get_sender.
源码如下

local function get_sender(node)
    local s = sender[node]
    if not s then
        local q = task_queue[node]
        local task = coroutine.running()
        table.insert(q, task)
        skynet.wait(task)
        skynet.wakeup(q.confirm)
        return q.sender
    end
    return s
end
上一篇下一篇

猜你喜欢

热点阅读