mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-26 00:35:15 +00:00
maxapi: improve nonce update with retry
This commit is contained in:
parent
65a2d21632
commit
8d240e9b4c
|
@ -23,6 +23,7 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
|
|
||||||
"github.com/c9s/bbgo/pkg/util"
|
"github.com/c9s/bbgo/pkg/util"
|
||||||
|
"github.com/c9s/bbgo/pkg/util/backoff"
|
||||||
"github.com/c9s/bbgo/pkg/version"
|
"github.com/c9s/bbgo/pkg/version"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -147,16 +148,41 @@ func (c *RestClient) Auth(key string, secret string) *RestClient {
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RestClient) initNonce() {
|
func (c *RestClient) queryAndUpdateServerTimestamp(ctx context.Context) {
|
||||||
var clientTime = time.Now()
|
for {
|
||||||
var err error
|
select {
|
||||||
serverTimestamp, err = c.PublicService.Timestamp()
|
case <-ctx.Done():
|
||||||
if err != nil {
|
return
|
||||||
logger.WithError(err).Panic("failed to sync timestamp with max")
|
|
||||||
}
|
|
||||||
|
|
||||||
timeOffset = serverTimestamp - clientTime.Unix()
|
default:
|
||||||
logger.Infof("loaded max server timestamp: %d offset=%d", serverTimestamp, timeOffset)
|
op := func() error {
|
||||||
|
serverTs, err := c.PublicService.Timestamp()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if serverTs == 0 {
|
||||||
|
return errors.New("unexpected zero server timestamp")
|
||||||
|
}
|
||||||
|
|
||||||
|
clientTime := time.Now()
|
||||||
|
offset := serverTs - clientTime.Unix()
|
||||||
|
|
||||||
|
atomic.StoreInt64(&serverTimestamp, serverTs)
|
||||||
|
atomic.StoreInt64(&timeOffset, offset)
|
||||||
|
|
||||||
|
logger.Infof("loaded max server timestamp: %d offset=%d", serverTimestamp, offset)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := backoff.RetryGeneral(ctx, op); err != nil {
|
||||||
|
logger.WithError(err).Error("unable to sync timestamp with max")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *RestClient) initNonce() {
|
||||||
|
go c.queryAndUpdateServerTimestamp(context.Background())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RestClient) getNonce() int64 {
|
func (c *RestClient) getNonce() int64 {
|
||||||
|
@ -164,7 +190,8 @@ func (c *RestClient) getNonce() int64 {
|
||||||
// nonce 與伺服器的時間差不得超過正負30秒,每個 nonce 只能使用一次。
|
// nonce 與伺服器的時間差不得超過正負30秒,每個 nonce 只能使用一次。
|
||||||
var seconds = time.Now().Unix()
|
var seconds = time.Now().Unix()
|
||||||
var rc = atomic.AddInt64(&reqCount, 1)
|
var rc = atomic.AddInt64(&reqCount, 1)
|
||||||
return (seconds+timeOffset)*1000 - 1 + int64(math.Mod(float64(rc), 1000.0))
|
var offset = atomic.LoadInt64(&timeOffset)
|
||||||
|
return (seconds+offset)*1000 - 1 + int64(math.Mod(float64(rc), 1000.0))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RestClient) NewAuthenticatedRequest(ctx context.Context, m string, refURL string, params url.Values, payload interface{}) (*http.Request, error) {
|
func (c *RestClient) NewAuthenticatedRequest(ctx context.Context, m string, refURL string, params url.Values, payload interface{}) (*http.Request, error) {
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
var MaxRetries uint64 = 101
|
var MaxRetries uint64 = 101
|
||||||
|
|
||||||
|
// RetryGeneral retries operation with max retry times 101 and with the exponential backoff
|
||||||
func RetryGeneral(ctx context.Context, op backoff.Operation) (err error) {
|
func RetryGeneral(ctx context.Context, op backoff.Operation) (err error) {
|
||||||
err = backoff.Retry(op, backoff.WithContext(
|
err = backoff.Retry(op, backoff.WithContext(
|
||||||
backoff.WithMaxRetries(
|
backoff.WithMaxRetries(
|
||||||
|
|
Loading…
Reference in New Issue
Block a user