Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Go TCP请求数控制

基于Go实现TCP长连接上的请求数控制

作者:二郎腿

在服务端开启长连接的情况下,四层负载均衡转发请求时,会出现服务端收到的请求qps不均匀的情况或是服务器无法接受到请求,因此需要服务端定期主动断开一些长连接,所以本文给大家介绍了基于Go实现TCP长连接上的请求数控制,需要的朋友可以参考下

一、背景

二、基本介绍

1,TCP 的 Keepalive:

2,HTTP 的 Keep-Alive

* Connection: keep-alive
* Keep-Alive: timeout=7200

3,四层负载均衡

4,七层负载均衡

三、具体实现

1,代码示例

package main

import (
	"sync"
	"time"

	"github.com/labstack/echo"
)

type QpsBalance struct {
	mu   sync.Mutex
	data map[string]int // key: ip:port
	num  int            // 通过配置文件来配置
}

// Update 返回 true 表示当前的 tcp 连接上的请求数超过限制,需要断开连接
// 如果是某个 tcp 连接长时间没有后续请求了,默认 15s 之后会发送保活报文,
func (q *QpsBalance) Update(k string) bool {
	q.mu.Lock()
	defer q.mu.Unlock()

	num := q.data[k] + 1
	if num >= q.num {
		q.data[k] = 0
		return true
	}
	q.data[k] = num
	return false
}

// Reset 通过定时任务每天3点重置,避免上游多次不同的扩容ip形成脏数据
func (q *QpsBalance) Reset() {
	q.mu.Lock()
	defer q.mu.Unlock()

	q.data = make(map[string]int)
}

func (q *QpsBalance) Init(n int) {
	q.mu.Lock()
	defer q.mu.Unlock()

	q.data = make(map[string]int)
	q.num = n
}

func main() {
	balancer := &QpsBalance{}
	balancer.Init(200)
	e := echo.New()
	e.PUT("/handle", func(c echo.Context) error {
		if balancer.Update(c.Request().RemoteAddr) {
			c.Response().Header().Set("Connection", "close")
		}
		// do other
		return nil
	})

	go func(b *QpsBalance) {
		ticker := time.NewTicker(time.Hour)
		for {
			t := <-ticker.C
			if t.Hour() == 3 {
				b.Reset()
			}
		}
	}(balancer)
}

2,基本原理

四、数据验证

以上就是基于Go实现TCP长连接上的请求数控制的详细内容,更多关于Go TCP请求数控制的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文