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

所以我正在尝试使用带有 fluentd 的 unix sockets 进行日志记录任务并随机发现,偶尔会出现错误


拨号:{socket_name} 资源暂时不可用


关于为什么会发生这种情况的任何想法?


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


另外,对于fluntd,我们使用unix sockets通信的默认配置


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()

}


繁星点点滴滴
浏览 339回答 2
2回答

心有法竹

Go 以非阻塞模式创建它的套接字,这意味着某些通常会阻塞的系统调用。在大多数情况下,它EAGAIN通过等待套接字准备好读/写来透明地处理错误(由“资源暂时不可用”消息指示的内容)。不过,它似乎没有这种connect调用逻辑Dial。如果侦听队列已满,则在连接到 UNIX 域套接字时可能connect会返回EAGAIN。如果客户端连接到它的速度比它接受它们的速度快,就会发生这种情况。在这种情况下,Go 可能应该等待套接字,直到它变得可连接,然后重试类似于它对Read/所做的事情Write,但它似乎没有这种逻辑。所以你最好的办法是通过等待和重试Dial调用来处理错误。那,或者找出您的服务器不及时接受连接的原因。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go