From a57b22edbb3a7de383ad7a94387000bfd4eca194 Mon Sep 17 00:00:00 2001 From: AlexStocks Date: Sat, 11 Jan 2020 21:36:11 +0800 Subject: [PATCH] Imp: enlarge time wheel span from 2m to 15m --- change_log.md | 417 -------------------------------------------------- client.go | 2 +- server.go | 2 +- session.go | 22 ++- 4 files changed, 17 insertions(+), 426 deletions(-) delete mode 100644 change_log.md diff --git a/change_log.md b/change_log.md deleted file mode 100644 index 8aaf195f..00000000 --- a/change_log.md +++ /dev/null @@ -1,417 +0,0 @@ -# getty # ---- - *a netty like asynchronous network I/O library* - -## introdction ## ---- -> DESC : a asynchronous network I/O library in golang. In getty there are two goroutines in one connection(session), - one handle network read buffer tcp stream, the other handle logic process and write response into network - write buffer. If your logic process may take a long time, you should start a new logic process goroutine - by yourself in (Codec):OnMessage. Getty is based on "ngo" whose author is sanbit(https://github.com/sanbit). -> -> LICENCE : Apache License 2.0 - -## develop history ## ---- - -- 2019/06/08 - > Improvement - * add task worker pool - -- 2019/06/07 - > Improvement - * use time.After instead of wheel.After - * add remark for tcp reading - -- 2018/10/16 - > Feature - * add rpc/micro CallOneway/AsyncCall - * version: v1.0.3 - -- 2018/08/19 - > Feature - * use multiple service config in service configuration - * do not register consumer - * version: v1.0.2 - -- 2018/08/16 - > Feature - * Add gxpool.watcher filter - -- 2018/08/13 - > Feature - * Add Micro - -- 2018/08/07 - > Improvement - * RPC package format: {2 Bytes Header len + Header + 2 Body len + Body} ---> {Header + Body} - > Bug Fix - * do not encode body if package body is nil - -- 2018/07/01 - > Feature - * Add RPC - -- 2018/06/25 - > buf fix - * Using juju/errors.Cause on read/write in case of network i/o timeout - -- 2018/03/29 - > improvement - * use juju/errors instead of pkg/errors - -- 2018/03/20 - > bug fix - * ignore connectPingPackage - -- 2018/03/19 - > improvement - * use gxnet.IsSameAddr - * send out pkg asap in WritePkg when the second parameter @timeout is not greater then 0. - * delete Chinese commenting - * gettyConn:readCount -> gettyConn:readBytes - * gettyConn:writeCount -> gettyConn:writeBytes - * gettyConn:readPkgCount -> gettyConn:readPkgNum - * gettyConn:writePkgCount -> gettyConn:writePkgNum - -- 2018/03/18 - > improvement - * nerr -> netError - * check udp connection alive after connect() - * use ReadFromUDP as the uniform UDP read interface - * close net.UDPConn when connected failed - * close net.Conn when connected failed - * Session::EndPointType() -> Session::EndPoint() - * time.Sleep() -> wheel.After() - * do not check server.go:server::caCert - -- 2018/03/17 - > improvement - * add end point type - * add ClientOptions & Client - * add ServerOptions & Server - * delete peerAddr of UDPSession - * version 0.8.2 - -- 2018/03/16 - > bug fix - * set maxMsgLen of UDPSession from zero to 4k - -- 2018/03/15 - > improvement - * add gettyUDPConn to session::Conn and session::gettyConn - -- 2018/03/14 - > bug fix - * disable SetReadDeadline when enable compression. - - Refers to the NextReader/NextWriter of gorilla/websocket, you should make a new compression reader/writer when - read/write a package again. - -- 2018/03/10 - > improvement - * 1 rDeadline -> rTimeout - * 2 wDeadline -> wTimeout - * 3 disable readtimeout in gettyWSConn:read - * 4 add gettyWSConn:updateWriteDeadline - * 5 add timeout for Session:WritePkg - -- 2018/03/08 - > feature - * 1 add udp client and udp server - - > version: 0.8.01 - -- 2017/05/02 - > feature - * 1 set read/write deadline for every read/write action refers to fasthttp - - > version: 0.7.04 - -- 2017/04/27 - > bug fix - * 1 client connect wss server just using the cert file. - - > version: 0.7.03 - -- 2017/04/21 - > bug fix - * 1 client can not connect wss server because of getty does not verify whether cert&key is nil or not in client.go:dialWSS - - > version: 0.7.02 - -- 2017/02/08 - > improvement - > - > 1 server shutdown in server.go:(Server) stop() - > - > 2 session variable -> ss - > - > 3 RunWSEventLoopWithTLS -> RunWSSEventLoop - > - > 4 version: 0.7.01 - -- 2017/02/03 - > 1 Session struct -> session struct and add Session interface - > - > 2 change receiver name from this to a alphabet letter - > - > 3 add compression type - > - > 4 version: 0.7.0 - -- 2016/11/19 - > 1 add conn.go:(*gettyWSConn) setCompressType to add zip compress feature for ws connection - > - > 2 version: 0.6.02 - -- 2016/11/16 - > 1 add zip/snappy compress for tcp connection - > - > 2 version: 0.6.01 - -- 2016/11/02 - > 1 add session.go:Session{ID(), LocalAddr(), RemoteAddr()} - > - > 2 add conn.go:iConn{id(), localAddr(), remoteAddr()} - > - > 3 version: 0.4.08 - -- 2016/11/01 - > 1 session.go:Session{maxPkgLen(int)} -> Session{maxPkgLen(int32)} - > - > 2 add remarks in session.go - > - > 2 version: 0.4.07(0.4.06 is a obsolete version) - -- 2016/10/21 - > 1 session.go:(Session)RunEventLoop -> session.go:(Session)run - > - > 2 version: 0.4.05 - -- 2016/10/14 - > 1 add conn.go:(gettyWSConn)handlePing - > - > 2 add conn.go:(gettyWSConn)handlePong - > - > 3 set read/write timeout in session.go:(Session)stop to let read/write timeout asap - > - > 4 fix bug: websocket block on session.go:(Session)handleWSPkg when got error. set read/write timeout asap to solve this problem. - > - > 5 version: 0.4.04 - -- 2016/10/13 - > 1 add conn.go:(gettyWSConn)writePing which is invoked automatically in session.go:(Session)handleLoop - > - > 2 modify session.go:(Session)handleLoop:Websocket session will send ping frame automatically every peroid. - > - > 3 add conn.go:(gettyConn)UpdateActive, which can used as (Session)UpdateActive which is invoked by Session automatically. - > - > 4 add conn.go:(gettyConn)GetActive, which can used as (Session)GetActive - > - > 5 modify conn.go:gettyWSConn{websocket.Conn} -> conn.go:gettyWSConn{*websocket.Conn} - > - > 6 version: 0.4.03 - -- 2016/10/11 - > 1 fix bug: use websocket.BinaryMessage in conn.go:(gettyWSConn)write - > - > 2 version: 0.4.02 - -- 2016/10/10 - > 1 delete session.go:Session{errFlag} to invoke codec.go:EventListener{OnClose&OnError} both when got a error - > - > 2 modify session.go:(Session)SetReader - > - > 3 modify session.go:(Session)SetWriter - > - > 4 add modify session.go:(Session)maxMsgLen for websocket session - > - > 5 version: 0.4.01 - -- 2016/10/09 - > 1 add client.go:NewWSSClient - > - > 2 add server.go:RunWSEventLoopWithTLS - > - > 3 add session.go:(Session*)gettyConn - -- 2016/10/08 - > 1 add websocket connection & client & server - > - > 3 version: 0.4.0 - -- 2016/10/01 - > 1 remark SetReadTimeout & SetWriteTimeout in session.go (ref: https://github.com/golang/go/issues/15133) - > - > 3 version: 0.3.14 - -- 2016/09/30 - > 1 modify wheel time interval from 1 second to 100ms. - > - > 2 modify session.go:(Session)WritePkg timeout - > - > 3 version: 0.3.13 - -- 2016/09/27 - > 1 fix bug: getty panic when conn.RemoteAddr() is nil in session.go:(Session)sessionToken() - > - > 2 version: 0.3.12 - -- 2016/09/26 - > 1 move utils.go's function to github.com/AlexStocks/goext and delete it - > - > 2 use goext/time Wheel - > - > 3 version: 0.3.11 - -- 2016/09/20 - > 1 just invoke OnError when session got error - > - > 2 version: 0.3.10 - -- 2016/09/19 - > 1 move empty to from client.go to session.go - > - > 2 version: 0.3.09 - -- 2016/09/12 - > 1 add defeat self connection logic in client.go & server.go - > - > 2 version: 0.3.08 - -- 2016/09/09 - > 1 delete session.go:(Session)readerDone - > - > 2 delete session.go:(Session)handlePackage Last clause - > - > 3 set write timeout in session.go:(Session)WritePkg - > - > 4 version: 0.3.07 - -- 2016/09/08 - > 1 rewrite session.go:(Session)handlePackage() error handle logic - > - > 2 add utils.go:CountWatch - > - > 3 version: 0.3.06 - -- 2016/09/07 - > 1 session.go:(Session)Close() -> session.go:(Session)gc() to be invoked by session.go:(Session)handleLoop - > - > 2 add panic stack message for session.go:(Session)handleLoop & session.go:(Session)handlePackage - > - > 3 version: 0.3.05 - -- 2016/09/06 - > 1 codec.go:(Reader)Read(*Session, []byte) (interface{}, error) -> codec.go:(Reader)Read(*Session, []byte) (interface{}, int, error) - > - > 2 codec.go:(EventListener)OnOpen(*Session) -> codec.go:(EventListener)OnOpen(*Session) error - > - > 3 version: 0.3.04 - -- 2016/09/05 - > 1 add 'errFlag = true' when got err in pkgHandler.Read loop clause in session.go:(Session)handlePackage - > - > 2 use '[]byte' instead of bytes.Buffer in codec.go:(Reader)Read - > - > 3 version: 0.3.03 - -- 2016/09/04 - > 1 add server.go:(Server)Listen - > - > 2 version: 0.3.02 - -- 2016/09/03 - > 1 modify return value of session.go:(Session)Close from void to error - > - > 2 add clause "this.attrs = nil" in session.go:(Session)Close - > - > 3 session.go:Session{*gettyConn, readTimeout, writeTimeout} -> session.go:Session{gettyConn, rTimeout, wTimeout} - > - > 4 add session.go:(Session)Reset - > - > 5 add session.go:(Session)SetConn - > - > 6 add elastic sleep time machanism in client.go:(Client)RunEventLoop - > - > 7 version: 0.3.01 - -- 2016/09/02 - > 1 add session.go:(gettyConn)close and session.go:(Session)dispose - > - > 2 modify return value of server.go:NewSessionCallback from void to err - > - > 3 add client.go:Client - > - > 4 version: 0.3.00 - -- 2016/08/29 - > 1 rename reconnect to errFlag in function session.go:(Session)handlePackage - > - > 2 session.go:(gettyConn)readBytes is reconsidered as read in tcp stream bytes - > - > 3 session.go:(gettyConn)writeBytes is reconsidered as write out tcp stream bytes - > - > 4 reconstruct session output token string session.go:(Session)sessionToken - > - > 5 use err instead of netError in session.go:(Session)handlePackage:defer:OnError - > - > 6 version: 0.2.07 - -- 2016/08/25 - > 1 move close done to once clause in server.go:(Server)stop - > - > 2 rename reqQ to rQ which means read queue and its relative params - > - > 3 rename rspQ to wQ which means write queue and its relative params - > - > 4 rename reqPkg to inPkg in function session.go:(Session)handleLoop - > - > 5 rename rspPkg to outPkg in function session.go:(Session)handleLoop - > - > 6 version: 0.2.06 - -- 2016/08/24 - > 1 delete session.go:Session:wg(atomic.WaitGroup). Add session.go:Session:grNum instead to prevent from (Session)Close() block on session.go:Session:wg.Wait() - > - > 2 add once for session.go:Session:done(chan struct{}) - > - > 3 version: 0.2.05 - -- 2016/08/23 - > 1 do not consider empty package as a error in (Session)handlePackage - > - > 2 version: 0.2.04 - -- 2016/08/22 - > 1 rename (Session)OnIdle to (Session)OnCron - > - > 2 rewrite server.go: add Server{done, wg} - > - > 3 add utils.go - > - > 4 version: 0.2.03 - -- 2016/08/21 - > 1 add name for Session - > - > 2 add OnError for Codec - -- 2016/08/18 - > 1 delete last clause of handleRead - > - > 2 add reqQ handle case in last clause of handleLoop - > - > 3 add conditon check in (*Session)RunEventLoop() - > - > 4 version: 0.2.02 - -- 2016/08/16 - > 1 rename all structs - > - > 2 add getty connection - > - > 3 rewrite (Session)handleRead & (Session)handleEventLoop - > - > 4 version: 0.2.01 diff --git a/client.go b/client.go index 8d7c8e4c..a3d5fe87 100644 --- a/client.go +++ b/client.go @@ -24,9 +24,9 @@ import ( import ( "github.com/dubbogo/gost/bytes" + "github.com/dubbogo/gost/net" "github.com/gorilla/websocket" perrors "github.com/pkg/errors" - "github.com/dubbogo/gost/net" ) const ( diff --git a/server.go b/server.go index 2cc7dd9b..14e37d91 100644 --- a/server.go +++ b/server.go @@ -23,9 +23,9 @@ import ( ) import ( + "github.com/dubbogo/gost/net" "github.com/gorilla/websocket" perrors "github.com/pkg/errors" - "github.com/dubbogo/gost/net" ) var ( diff --git a/session.go b/session.go index 85812db1..260e2f52 100644 --- a/session.go +++ b/session.go @@ -30,12 +30,14 @@ import ( ) const ( - maxReadBufLen = 4 * 1024 - netIOTimeout = 1e9 // 1s - period = 60 * 1e9 // 1 minute - pendingDuration = 3e9 - defaultQLen = 1024 - maxIovecNum = 10 + maxReadBufLen = 4 * 1024 + netIOTimeout = 1e9 // 1s + period = 60 * 1e9 // 1 minute + pendingDuration = 3e9 + defaultQLen = 1024 + maxIovecNum = 10 + MaxWheelTimeSpan = 900e9 // 900s, 15 minute + defaultSessionName = "session" defaultTCPSessionName = "tcp-session" defaultUDPSessionName = "udp-session" @@ -49,9 +51,15 @@ const ( ///////////////////////////////////////// var ( - wheel = gxtime.NewWheel(gxtime.TimeMillisecondDuration(100), 1200) // wheel longest span is 2 minute + wheel *gxtime.Wheel ) +func init() { + span := 100e6 // 100ms + buckets := MaxWheelTimeSpan / span + wheel = gxtime.NewWheel(time.Duration(span), int(buckets)) // wheel longest span is 15 minute +} + func GetTimeWheel() *gxtime.Wheel { return wheel }