【社区福利】使用优惠价格购买《Go Web 编程》

文章分享LockingCoder 回复了问题 • 4 人关注 • 3 个回复 • 560 次浏览 • 15 小时前 • 来自相关话题

golang中time类型的这个是什么意思?

有问必答singlethread 回复了问题 • 4 人关注 • 3 个回复 • 258 次浏览 • 4 天前 • 来自相关话题

很期待Golang能有自己的客户端UI库

有问必答jitongxi 回复了问题 • 4 人关注 • 4 个回复 • 517 次浏览 • 13 小时前 • 来自相关话题

GoCN每日新闻(2017-11-19)

每日新闻tan90 回复了问题 • 4 人关注 • 2 个回复 • 675 次浏览 • 4 天前 • 来自相关话题

riot 搜索引擎 v0.10.0 发布, 优化引擎和分词等

回复

开源程序veni 发起了问题 • 2 人关注 • 0 个回复 • 215 次浏览 • 3 天前 • 来自相关话题

GoCN每日新闻(2017-11-18)

每日新闻fiisio 回复了问题 • 2 人关注 • 1 个回复 • 577 次浏览 • 5 天前 • 来自相关话题

GoCN每日新闻(2017-11-24)

回复

每日新闻cloudy 发起了问题 • 2 人关注 • 0 个回复 • 243 次浏览 • 18 小时前 • 来自相关话题

Redis的key类型,value类型,以及value中的value类型

有问必答tupunco 回复了问题 • 2 人关注 • 1 个回复 • 145 次浏览 • 5 天前 • 来自相关话题

遍历一个[][]string,那他的每个item是一个[]string么?

有问必答xkey 回复了问题 • 1 人关注 • 1 个回复 • 142 次浏览 • 1 天前 • 来自相关话题

GoCN每日新闻(2017-11-25)

回复

每日新闻samurai 发起了问题 • 1 人关注 • 0 个回复 • 17 次浏览 • 46 分钟前 • 来自相关话题

Beego当客户端cookie为空时报错

回复

有问必答shuaicode 回复了问题 • 1 人关注 • 1 个回复 • 24 次浏览 • 5 小时前 • 来自相关话题

积梦智能招实习生

招聘应聘astaxie 发表了文章 • 0 个评论 • 1208 次浏览 • 4 天前 • 来自相关话题

首先你会问积梦智能是什么公司啊,那我就先套路一下,“积梦智能”是一家工业智能科技公司,致力于生产过程中的大数据管理应用和分析。通过监控制造生产中的设备状态、环境因素、人员情况、产品质量、工艺过程等,深度挖掘和系统分析这些数据,从而优化作业流程、提高设备能... 查看全部

首先你会问积梦智能是什么公司啊,那我就先套路一下,“积梦智能”是一家工业智能科技公司,致力于生产过程中的大数据管理应用和分析。通过监控制造生产中的设备状态、环境因素、人员情况、产品质量、工艺过程等,深度挖掘和系统分析这些数据,从而优化作业流程、提高设备能效、增加人均产能、提升产品质量。


说简单一点就是我们做工业大数据分析,说技术性一点就是我们要去解决很多技术性难点,下面列一些挑战点:



  1. 大数据的管理,我们需要OLTP和OLAP同时支持,所以这一块的挑战很大,如何做到横向无限扩展同时又能支持这两个特性。

  2. 数据分析,数据分析主要有以下几点:

    • 可视化分析
      我们知道目前有tableau、JMP等工具,但是我们怎么样结合我们的数字工厂模型来搞工业相关的分析模型,这一块的挑战是大数据量的实时可视化分析,建模。

    • 关联性分析
      工厂都有很多专家可以去分析各种制造过程中的关联因素,但是怎么样让机器去分析出来这些关联性。

    • 预测分析
      预测性分析其实是在各种可视化分析和数据挖掘的情况下做出的模型预测,这个需要我们有深度的大数据学习能力


  3. 工业设备互联,工业设备和传统的互联网不一样的地方是会认识很多以前没接触过东西,例如工控机、PLC、机械手臂、激光设备、白光测量设备等等

  4. 数字工厂模型,工厂很多,但是如何用抽象一套模型可以高度的抽象化去适应不同的工厂呢?为什么其他人都在定制化,而我们不做,因为我们是技术人,也只有技术人才有抽象化的思想,这是我一直坚信的一个理念,技术改变世界。


那么我们需要怎么样的人呢?



  1. 我们需要科班出身的人,也就是希望你是学习计算机出生的本科或者硕士生,

  2. 之前已经写过一些一段时间的代码,有github是最好的

  3. 编程是你最大的兴趣,因为这是你一辈子要去从事的行业,只有兴趣才能激发你成为牛逼的人


如果你满足上面的几点请给我简历吧,邮箱:asta.xie@jimeng.io

GoCN每日新闻(2017-11-22)

回复

每日新闻moss 发起了问题 • 2 人关注 • 0 个回复 • 332 次浏览 • 2 天前 • 来自相关话题

GOLANG探测HTTP连接断开

技术讨论winlin 发表了文章 • 1 个评论 • 223 次浏览 • 2 天前 • 来自相关话题

考虑基于HTTP的RPC,或者HTTP服务器主动通知客户端的机制,就是HTTP Long-Polling,意思... 查看全部

考虑基于HTTP的RPC,或者HTTP服务器主动通知客户端的机制,就是HTTP Long-Polling,意思就是客户端发起一个长连接,服务器阻塞忍住不响应直到:



  1. 超时,比如5秒后,我们给客户端响应一个keepalive,意思是现在还没有啥事,请继续polling。

  2. 拿到结果,这个可能是任何时候,比如300毫秒、1100毫秒、2300毫秒拿到一个事件,响应给客户端,实现了有事件异步通知。


这样客户端和服务器之间RPC的效率就非常高,只有在有事件时才会通知。但是,实际上还有一种情况需要处理:



  1. 当客户端断开连接,比如客户端设置了3秒钟TCP请求超时,或者因为客户端Crash时OS回收了FD等等,这个时候服务器应该要终止polling事务,停止获取事件。因为如果这个时候获取了事件,那么如何处理这个事件?只能丢弃,如果客户端再次发起请求,就拿不到这个事件了。


问题就来了,如何在HTTP Handler中探测客户端断开?例如:


var incoming chan []byte
http.HandleFunc("/polling", func(w http.ResponseWriter, r *http.Request) {
select {
case b := <- incoming:
w.Write(b)
case <-time.After(5 * time.Second):
w.Write("keepalive")
// how to detect TCP disconnect event?
}
})

可能有以下方式:



  1. 读取r.Body,如果发现断开应该会有错误。

  2. 有朋友用reflect或hijack取到底层的TCPConn,然后Peek。

  3. w转换成http.CloseNotifier,在TCP连接关闭时拿到事件。


r.Body Read


这种方式是不靠谱的,假设没有Body内容,直接读取检测是否有error:


nn,err := io.Copy(ioutil.Discard, r.Body)

实际上返回的是nn=0err=nil,也就是没有Body,没有错误。因为这个读取的含义是指Request结束。


如果读取完Body后再读呢?收到的是io.EOF,在没有发送Response之前,Request已经结束了,所以就是io.EOF,并不能检测到底层TCP断开。


Peek TcpConn


使用reflect获取底层的TCPConn对象,是知道w http.ResponseWriter实际上是http.response


// A response represents the server side of an HTTP response.
type response struct {
conn *conn

它有个Field就是conn,再转成TCPConn就可以Peek。


这样做的风险就是,不同的GOLANG版本,可能会对底层实现进行变更,在升级时会有风险。


Reflect方式始终不是最好的。


另外,还有一种方式,就是用http hijack方式,这种方式虽然是http库提供的接口,但是很多地方注释都说hijack需要特殊处理,因此也不是最好的方式。参考When to use hijack


Close Notifier


在GO1.1提供了http.CloseNotifier接口,参考Close Notifier,但是也注意会有一些问题,参考net/http: CloseNotifier fails to fire when underlying connection is gone。用法如下:


var incoming chan []byte
http.HandleFunc("/polling", func(w http.ResponseWriter, r *http.Request) {
select {
case <- w.(http.CloseNotifier).CloseNotify():
fmt.Println("connection closed")
}
})

实际上,超时机制始终是需要的,加上之前的逻辑,考虑context.Context取消事件,http-long polling的完整实现应该是:


func polling(ctx context.Context, incoming chan []byte) {
http.HandleFunc("/polling", func(w http.ResponseWriter, r *http.Request) {
select {
case <- ctx.Done():
fmt.Println("system quit")
case b := <- incoming:
w.Write(b)
case <-time.After(5 * time.Second):
w.Write("keepalive")
case <- w.(http.CloseNotifier).CloseNotify():
fmt.Println("connection closed")
}
})
}

小而美的公司 武汉微派网络科技有限公司 招人啦!担心年终奖?这个在微派不是问题

回复

招聘应聘wepiehr 发起了问题 • 1 人关注 • 0 个回复 • 210 次浏览 • 2 天前 • 来自相关话题