conn

package
v0.9.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 10, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Overview

Package conn 提供连接管理相关的工具。

Index

Constants

View Source
const DefaultDialTimeout = 10 * time.Second

DefaultDialTimeout 是 NewDefaultManager 拨号超时(#77)。

裸 net.Dial 没有超时:对黑 hole 对端(SYN 有去无回的端口),每次拨号 会挂在操作系统自己的超时上——macOS 上是 75 秒(同仓 sshx/dial.go 对 connectTimeout 的论证原文)。作为「自动重连」组件,退化形态是每次重连 假死 75s+:连接数虽少,可用性长时间为零。10s 与 sshx.DefaultConnectTimeout 同量级:远大于正常建连 RT,又把最坏情况压回一个重连周期内。

Variables

View Source
var ErrConnectionUnavailable = errors.New("connection unavailable")

ErrConnectionUnavailable 在连接不可用时由 Write 方法返回。

Functions

func Exponential

func Exponential(d time.Duration) time.Duration

Exponential 计算指数退避时间(带 ±50% 抖动),上限 1 分钟。 用于避免重连风暴(thundering herd)。

输入被夹进 [正数, 半分钟] 再翻倍(#102):此前的 `d *= 2` 无溢出检查, d 接近 math.MaxInt64 时翻倍回绕成负数,而「> time.Minute」的钳制对负数 不成立 ⇒ 导出函数直接返回负退避——交给 time.After 等价于立即触发,恰是 它要防的重连风暴。现在乘法前先判界(> 半分钟即置为上限,翻倍必然越界), 结果再钳一次上限、并对非正数兜底一个最小正退避——「上限 1 分钟」对任何 int64 都成立。

Types

type AfterFunc

type AfterFunc func(time.Duration) <-chan time.Time

AfterFunc 模仿 time.After,用于控制重连退避时间。

type Dialer

type Dialer func(network, address string) (net.Conn, error)

Dialer 模仿 net.Dial,创建网络连接。 返回的连接必须是并发安全的。

type Manager

type Manager struct {
	// contains filtered or unexported fields
}

Manager 管理一个 net.Conn 的生命周期。

通过 Take 获取连接,通过 Put 报告错误。 当 Put 收到非 nil error 时,当前连接失效,Manager 自动重连(指数退避)。

func NewDefaultManager

func NewDefaultManager(network, address string) *Manager

NewDefaultManager 创建一个使用默认配置的连接管理器。 拨号带 DefaultDialTimeout 超时(#77),重连退避用 time.After。

func NewManager

func NewManager(d Dialer, network, address string, after AfterFunc) *Manager

NewManager 创建一个连接管理器。

参数:

  • d: 连接创建函数
  • network/address: 传递给 Dialer
  • after: 时间控制函数(测试可注入,生产用 time.After)

func (*Manager) Put

func (m *Manager) Put(err error)

Put 报告连接使用中产生的错误。 非 nil error 会导致当前连接被关闭并触发重连。 Stop 后调用是空操作。

func (*Manager) Stop

func (m *Manager) Stop()

Stop 停止管理器,关闭当前连接,解除所有阻塞的 Take/Put 调用。

func (*Manager) Take

func (m *Manager) Take() net.Conn

Take 返回当前连接,可能为 nil(连接断开或尚未建立)。 Stop 后调用返回 nil。

func (*Manager) Write

func (m *Manager) Write(b []byte) (int, error)

Write 是便捷方法:自动 Take → Write → Put。 当连接不可用时返回 ErrConnectionUnavailable。

注意:Write 不是并发安全的。Take/Put 设计为单 goroutine 使用, 多 goroutine 调用 Write 会导致连接竞争。并发场景应由调用方加锁。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL