Sockets golang unix套接字错误。拨号:资源暂时不可用
因此,我尝试将unix套接字与fluentd一起用于日志记录任务,并偶尔随机发现错误 拨号:{socket\u name}资源暂时不可用 你知道为什么会发生这种情况吗 我尝试添加“重试”逻辑,以减少错误,但有时仍会发生 此外,对于fluntd,我们使用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,
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-inDial
似乎没有这种逻辑
当连接到UNIX域套接字时,如果其侦听队列已满,connect
可以返回EAGAIN
。如果客户端连接到它的速度比它接受它们的速度快,就会发生这种情况。Go可能应该等待套接字,直到它在这种情况下成为可连接的,然后重试,类似于它对读取
/写入
所做的操作,但它似乎没有这种逻辑
因此,您最好通过等待并重试
拨号
呼叫来处理错误。或者找出您的服务器没有及时接受连接的原因。可能是拨号
函数正在调用,如果路由缓存已满,它可以返回EAGAIN
。您可能正在重载套接字堆栈。尝试切换到指数退避(即每次重试时将重试\u持续时间延长一倍)。服务器进程的侦听队列是否已满?