Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 戈朗在生产中崩溃_Linux_Go - Fatal编程技术网

Linux 戈朗在生产中崩溃

Linux 戈朗在生产中崩溃,linux,go,Linux,Go,我有一个go程序,它连接到tcp服务器并将该消息发布到web服务。该应用程序在第一次运行时运行良好,大约一周后就会出现恐慌。我不知道为什么。堆栈跟踪也没有帮助。 (我从mac os交叉编译到linux;env-GOOS=linux-GOARCH=386 go-build) 有人能指出问题所在吗 tcp服务器连接可能会偶尔关闭一次;我已经手工建立了重连逻辑。 错误条件也适用于过帐。互联网连接可能随时中断;所以go默认使用“cgo”的“dns”解析器非常恐慌。我已经重新编译了“netgo”以使用纯g

我有一个go程序,它连接到tcp服务器并将该消息发布到web服务。该应用程序在第一次运行时运行良好,大约一周后就会出现恐慌。我不知道为什么。堆栈跟踪也没有帮助。 (我从mac os交叉编译到linux;env-GOOS=linux-GOARCH=386 go-build) 有人能指出问题所在吗

tcp服务器连接可能会偶尔关闭一次;我已经手工建立了重连逻辑。 错误条件也适用于过帐。互联网连接可能随时中断;所以go默认使用“cgo”的“dns”解析器非常恐慌。我已经重新编译了“netgo”以使用纯go网络实现

堆栈跟踪
net.runtime\u pollWait(0xf75c12d8、0x72、0x18690000)
/usr/local/go/src/runtime/netpoll.go:157+0x55 net.(*pollDesc).等待(0x18a6bb38,0x72,0x0,0x0)/usr/local/go/src/net/fd_poll_runtime.go:73+0x35
net.WaitRead(0x18a6bb38,0x0,0x0)\u poll\u runtime.go:78+0x33
net。(*netFD)。读取(0x18a6bb00、0x18cd6000、0x1000、0x1000、0x0、0xf75bc018、0x18690000)/usr/local/go/src/net/fd_unix.go:232+0x19anet。(*conn)。读取(0x18CD4478、0x18cd6000、0x1000、0x1000、0x0、0x0、0x0、0x0)
/usr/local/go/src/net/net.go:172+0xb9
net/http.NoteofReader.Read(0xf75fc018、0x18CD4478、0x1889770c、0x18cd6000、0x1000、0x1000、0x2c3620、0x0、0x0)
/usr/local/go/src/net/http/transport.go:1370+0x55
net/http。(*NoteoFreader).Read(0x18cd29e0、0x18cd6000、0x1000、0x1000、0x8056f0c、0x0、0x0)

主程序包
进口(
“布菲奥”
“字节”
“编码/json”
“旗帜”
“fmt”
“净额”
“net/http”
“时间”
)
变量(
server=flag.String(“deamon”、“127.0.0.1:7070”、“AMQP URI”)
msgRoutingKey=flag.String(“路由键”、“路由键”、“路由键”)
msgexchange=flag.String(“交换”、“交换”、“交换”)
mywebserviceServer=flag.String(“mywebserviceServer”、“127.0.0.1:8080”、“mywebserviceServer:port”)
)
func init(){
flag.Parse()
}
类型TcpConnector结构{
出站信道串
入站chan字符串
地址字符串
重新连接时间。持续时间
}
类型消息结构{
RoutingKey字符串`json:“RoutingKey”`
交换字符串`json:“交换”`
数据字符串`json:“数据”`
}
func main(){
开始:=时间。现在()
tcpClient:=newtcpcconnector(*服务器)
已用时间:=自(开始)起的时间
fmt.Println(“连接参数为%s”,*服务器,*msgexchange,*msgRoutingKey,*mywebserviceServer)
fmt.Println(“连接到守护进程需要%s”,已过)
go func(){
对于消息:=范围tcpClient.Inbound{
fmt.Println(味精)
rabbitMessage:=消息{
布线键:*msgRoutingKey,
交易所:*msgexchange,
资料:msg,,
}
mywebserviceMessageEndpoint:=fmt.Sprintf(“http://%s/v1/messages/publish”,*mywebserviceServer)
doPut(mywebserviceMessageEndpoint和rabbitMessage)
}
}()
选择{}
}
func doPut(url字符串,rabbitMessage*消息){
开始:=时间。现在()
b、 err:=json.Marshal(rabbitMessage)
客户端:=&http.client{}
请求,err:=http.NewRequest(“PUT”,url,bytes.NewBuffer(b))
request.Header.Add(“内容类型”、“应用程序/json”)
request.Header.Add(“接受”、“应用程序/json”)
响应,错误:=client.Do(请求)
如果错误!=零{
fmt.Println(错误)
}否则{
延迟响应。Body.Close()
fmt.Println(“,response.StatusCode”)
hdr:=响应.头文件
对于键,值:=范围hdr{
fmt.Println(“,键:”,值)
}
}
已用时间:=自(开始)起的时间
fmt.Println(“向mywebservice发布花费了%s”,已过)
}
func NewTcpConnector(地址字符串)*TcpConnector{
tcpConnector:=&tcpConnector{
地址:地址,
出站:make(chan string,100),
入境:制造(成串,100),
重新连接时间:30*次。秒,
}
tcpConnector.connect()
返回TCP连接器
}
//保持私人联系,如果被呼叫两次会有麻烦
func(tcpConnector*tcpConnector)connect(){
连接,错误:=网络拨号(“tcp”,tcpConnector.Addr)
如果错误!=零{
fmt.Println(“连接失败”,错误)
时间.睡眠(TCP连接器.重新连接时间)
tcpConnector.connect()
返回
}
go func(){
对于消息:=范围tcpConnector.Outbound{
_,err=fmt.Fprintf(连接,消息+“\n”)
如果错误!=零{
fmt.Println(“发送事件失败”,错误)
时间.睡眠(TCP连接器.重新连接时间)
tcpConnector.connect()
打破
}
}
}()
go func(){
读卡器:=bufio.NewReaderSize(康涅狄格州,1024*1024)
为了{
消息,错误:=reader.ReadBytes('\n')
如果错误!=零{
打破
}
fmt.Println(“收到的消息:%s”,消息)

tcpConnector.Inbound这真的是整个堆栈跟踪吗?您使用的是当前版本的Go吗?Go版本go1.5.1 darwin/amd64I正在将响应输出到控制台上;必须有更多的输出。这只是一个运行时goroutine堆栈,可能与您的错误无关,并且您没有任何sor的错误消息t、 快速浏览一下您的代码,您有一个带有注释“如果被调用两次,将有麻烦”的函数,但它不包含互斥,并且从两个不同的goroutine调用了两次。(更新到支持的Go版本也没什么坏处,目前为1.6.2)第二个连接块是错误恢复场景,如中所示;如果tcp连接中断,请等待配置的时间,然后重新连接。如果err!=nil{fmt.Println(“连接失败”,err)time.Sleep(tcpConnector.ReconnectTime)tcpConnector.connect()return}这真的是整个堆栈跟踪吗?您使用的是当前版本的Go吗?Go版本go1.5.1 darwin/amd64I正在将响应输出到控制台上;必须有更多的输出。仅此而已
net.runtime_pollWait(0xf75c12d8, 0x72, 0x18690000)
    /usr/local/go/src/runtime/netpoll.go:157 +0x55 net.(*pollDesc).Wait(0x18a6bb38, 0x72, 0x0, 0x0)/usr/local/go/src/net/fd_poll_runtime.go:73 +0x35
    net.(*pollDesc).WaitRead(0x18a6bb38, 0x0, 0x0) _poll_runtime.go:78 +0x33
    net.(*netFD).Read(0x18a6bb00, 0x18cd6000, 0x1000, 0x1000, 0x0, 0xf75bc018, 0x18690000)/usr/local/go/src/net/fd_unix.go:232 +0x19anet.(*conn).Read(0x18cd4d78, 0x18cd6000, 0x1000, 0x1000, 0x0, 0x0, 0x0)
    /usr/local/go/src/net/net.go:172 +0xb9
    net/http.noteEOFReader.Read(0xf75fc018, 0x18cd4d78, 0x1889770c, 0x18cd6000, 0x1000, 0x1000, 0x2c3620, 0x0, 0x0)
    /usr/local/go/src/net/http/transport.go:1370 +0x55
    net/http.(*noteEOFReader).Read(0x18cd29e0, 0x18cd6000, 0x1000, 0x1000, 0x8056f0c, 0x0, 0x0)
    <autogenerated>:126 +0xae
    bufio.(*Reader).fill(0x1881b7d0)
    /usr/local/go/src/bufio/bufio.go:97 +0x172
    bufio.(*Reader).Peek(0x1881b7d0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
    /usr/local/go/src/bufio/bufio.go:132 +0xad
    net/http.(*persistConn).readLoop(0x188976e0)
    /usr/local/go/src/net/http/transport.go:876 +0xe3
    created by net/http.(*Transport).dialConn
    /usr/local/go/src/net/http/transport.go:685 +0xabc
  package main

 import (
  "bufio"
  "bytes"
  "encoding/json"
  "flag"
  "fmt"
  "net"
  "net/http"
  "time"
  )

  var (
    server             = flag.String("deamon", "127.0.0.1:7070", "AMQP URI")
    msgRoutingKey      = flag.String("routingKey", "routingKey", " routing key")
    msgexchange        = flag.String("exchange", "exchange", " excahnge ")
    mywebserviceServer = flag.String("mywebservice-server", "127.0.0.1:8080",      "mywebserviceServer:port ")
  )

   func init() {

     flag.Parse()
   }

   type TcpConnector struct {
    Outbound      chan string
    Inbound       chan string
    Addr          string
    ReconnectTime time.Duration
   }

type Message struct {
  RoutingKey string `json:"routingKey"`
  Exchange   string `json:"exchange"`
  Data       string `json:"data"`
}

func main() {
  start := time.Now()
  tcpClient := NewTcpConnector(*server)
  elapsed := time.Since(start)
  fmt.Println("the connecting params are  %s", *server, *msgexchange, *msgRoutingKey, *mywebserviceServer)
  fmt.Println("connecting to daemon took %s", elapsed)
   go func() {
    for msg := range tcpClient.Inbound {
        fmt.Println(msg)
        rabbitMessage := Message{
            RoutingKey: *msgRoutingKey,
            Exchange:   *msgexchange,
            Data:       msg,
        }
        mywebserviceMessageEndpoint :=    fmt.Sprintf("http://%s/v1/messages/publish", *mywebserviceServer)
        doPut(mywebserviceMessageEndpoint, &rabbitMessage)

      }
    }()

   select {}
 }

func doPut(url string, rabbitMessage *Message) {
 start := time.Now()
 b, err := json.Marshal(rabbitMessage)
 client := &http.Client{}
 request, err := http.NewRequest("PUT", url, bytes.NewBuffer(b))
 request.Header.Add("Content-Type", "application/json")
 request.Header.Add("accept", "application/json")
 response, err := client.Do(request)
 if err != nil {
    fmt.Println(err)
 } else {
    defer response.Body.Close()
    fmt.Println("   ", response.StatusCode)
    hdr := response.Header
    for key, value := range hdr {
        fmt.Println("   ", key, ":", value)
    }

 }

 elapsed := time.Since(start)
 fmt.Println("posting to mywebservice took %s", elapsed)

}

func NewTcpConnector(addr string) *TcpConnector {
 tcpConnector := &TcpConnector{
    Addr:          addr,
    Outbound:      make(chan string, 100),
    Inbound:       make(chan string, 100),
    ReconnectTime: 30 * time.Second,
 }
 tcpConnector.connect()
 return tcpConnector
}

//keep connect private, will be in trouble if got called twice
func (tcpConnector *TcpConnector) connect() {
 conn, err := net.Dial("tcp", tcpConnector.Addr)
 if err != nil {
    fmt.Println("Failed to make a connection", err)
    time.Sleep(tcpConnector.ReconnectTime)
    tcpConnector.connect()
    return
 }

go func() {
    for msg := range tcpConnector.Outbound {

        _, err = fmt.Fprintf(conn, msg+"\n")
        if err != nil {
            fmt.Println("Failed sending event", err)
            time.Sleep(tcpConnector.ReconnectTime)
            tcpConnector.connect()
            break
        }

    }
}()
go func() {
    reader := bufio.NewReaderSize(conn, 1024*1024)
    for {
        message, err := reader.ReadBytes('\n')
        if err != nil {
            break
        }
        fmt.Println("Message Received: %s", message)
        tcpConnector.Inbound <- string(message)
        fmt.Println("Message sent to chan")
    }

    fmt.Println("reconnecting...")
    tcpConnector.connect()
}()
fmt.Println("Connected tcp")
}