From d978b3bbdcb36c4dc0712bf66a88aa07e8018b7b Mon Sep 17 00:00:00 2001 From: arttobe <38989619+arttobe@users.noreply.github.com> Date: Wed, 23 Jun 2021 07:53:57 +0200 Subject: [PATCH] Binance: Fix websocket subscribe error with many currency pairs enabled (#670) * Fix subscribe error with many currency pairs * Adds proper rate limit. Adds empty check. Co-authored-by: gloriousCode Co-authored-by: Scott --- exchanges/binance/binance_types.go | 2 ++ exchanges/binance/binance_websocket.go | 32 +++++++++++++++++++------- exchanges/binance/binance_wrapper.go | 1 + 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/exchanges/binance/binance_types.go b/exchanges/binance/binance_types.go index 5f6641a9..267b031e 100644 --- a/exchanges/binance/binance_types.go +++ b/exchanges/binance/binance_types.go @@ -8,6 +8,8 @@ import ( "github.com/thrasher-corp/gocryptotrader/exchanges/asset" ) +const wsRateLimitMilliseconds = 250 + // withdrawals status codes description const ( EmailSent = iota diff --git a/exchanges/binance/binance_websocket.go b/exchanges/binance/binance_websocket.go index 703cff72..8df87855 100644 --- a/exchanges/binance/binance_websocket.go +++ b/exchanges/binance/binance_websocket.go @@ -540,14 +540,21 @@ func (b *Binance) Subscribe(channelsToSubscribe []stream.ChannelSubscription) er payload := WsPayload{ Method: "SUBSCRIBE", } - for i := range channelsToSubscribe { payload.Params = append(payload.Params, channelsToSubscribe[i].Channel) + if i%50 == 0 && i != 0 { + err := b.Websocket.Conn.SendJSONMessage(payload) + if err != nil { + return err + } + payload.Params = []string{} + } } - - err := b.Websocket.Conn.SendJSONMessage(payload) - if err != nil { - return err + if len(payload.Params) > 0 { + err := b.Websocket.Conn.SendJSONMessage(payload) + if err != nil { + return err + } } b.Websocket.AddSuccessfulSubscriptions(channelsToSubscribe...) return nil @@ -560,10 +567,19 @@ func (b *Binance) Unsubscribe(channelsToUnsubscribe []stream.ChannelSubscription } for i := range channelsToUnsubscribe { payload.Params = append(payload.Params, channelsToUnsubscribe[i].Channel) + if i%50 == 0 && i != 0 { + err := b.Websocket.Conn.SendJSONMessage(payload) + if err != nil { + return err + } + payload.Params = []string{} + } } - err := b.Websocket.Conn.SendJSONMessage(payload) - if err != nil { - return err + if len(payload.Params) > 0 { + err := b.Websocket.Conn.SendJSONMessage(payload) + if err != nil { + return err + } } b.Websocket.RemoveSuccessfulUnsubscriptions(channelsToUnsubscribe...) return nil diff --git a/exchanges/binance/binance_wrapper.go b/exchanges/binance/binance_wrapper.go index 902511d5..20f2433e 100644 --- a/exchanges/binance/binance_wrapper.go +++ b/exchanges/binance/binance_wrapper.go @@ -241,6 +241,7 @@ func (b *Binance) Setup(exch *config.ExchangeConfig) error { return b.Websocket.SetupNewConnection(stream.ConnectionSetup{ ResponseCheckTimeout: exch.WebsocketResponseCheckTimeout, ResponseMaxLimit: exch.WebsocketResponseMaxLimit, + RateLimit: wsRateLimitMilliseconds, }) }