Sockets golang unix套接字错误。拨号:资源暂时不可用

Sockets golang unix套接字错误。拨号:资源暂时不可用,sockets,unix,go,Sockets,Unix,Go,因此,我尝试将unix套接字与fluentd一起用于日志记录任务,并偶尔随机发现错误 拨号:{socket\u name}资源暂时不可用 你知道为什么会发生这种情况吗 我尝试添加“重试”逻辑,以减少错误,但有时仍会发生 此外,对于fluntd,我们使用unix套接字通信的默认配置 func connect() { var connection net.Conn var err error for i := 0; i < retry_count; i++ { connection,

因此,我尝试将unix套接字与fluentd一起用于日志记录任务,并偶尔随机发现错误

拨号:{socket\u name}资源暂时不可用

你知道为什么会发生这种情况吗

我尝试添加“重试”逻辑,以减少错误,但有时仍会发生

此外,对于fluntd,我们使用unix套接字通信的默认配置

func connect() {

var connection net.Conn
var err error
for i := 0; i < retry_count; i++ {
    connection, err = net.Dial("unix", path_to_socket)
    if err == nil {
        break

    }
    time.Sleep(time.Duration(math.Exp2(float64(retry_count))) * time.Millisecond)
}
if err != nil {
    fmt.Println(err)

} else {
        connection.Write(data_to_send_socket)

    }
     defer connection.Close()
}
func connect(){
连接网络
变量错误
对于i:=0;i
对于指数退避,您可以使用以下库:。我认为你现在的睡眠方式,它总是睡相同的时间

对于网络错误,您需要检查它是否是临时错误。如果是,请重试:

type TemporaryError interface {
    Temporary() bool
}

func dial() (conn net.Conn, err error) {
    backoff.Retry(func() error {
        conn, err = net.Dial("unix", "/tmp/ex.socket")
        if err != nil {
            // if this is a temporary error, then retry
            if terr, ok := err.(TemporaryError); ok && terr.Temporary() {
                return err
            }
        }
        // if we were successful, or there was a non-temporary error, fail
        return nil
    }, backoff.NewExponentialBackOff())
    return
}

Go以非阻塞模式创建套接字,这意味着某些系统调用通常会被阻塞。在大多数情况下,它通过等待套接字准备好读/写,透明地处理
EAGAIN
错误(由“资源暂时不可用”消息指示)。不过,
connect
call-in
Dial
似乎没有这种逻辑

当连接到UNIX域套接字时,如果其侦听队列已满,
connect
可以返回
EAGAIN
。如果客户端连接到它的速度比它接受它们的速度快,就会发生这种情况。Go可能应该等待套接字,直到它在这种情况下成为可连接的,然后重试,类似于它对
读取
/
写入
所做的操作,但它似乎没有这种逻辑


因此,您最好通过等待并重试
拨号
呼叫来处理错误。或者找出您的服务器没有及时接受连接的原因。

可能是
拨号
函数正在调用,如果路由缓存已满,它可以返回
EAGAIN
。您可能正在重载套接字堆栈。尝试切换到指数退避(即每次重试时将
重试\u持续时间延长一倍)。服务器进程的
侦听队列是否已满?