Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录
切换导航
L
library
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
stbz
library
Commits
7c1296b1
提交
7c1296b1
authored
5月 11, 2026
作者:
张立波
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
nsq
上级
3f17abb3
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
76 行增加
和
17 行删除
+76
-17
consumer.go
notify/consumer.go
+76
-17
没有找到文件。
notify/consumer.go
浏览文件 @
7c1296b1
...
...
@@ -15,13 +15,29 @@ type NsqConfig struct {
Handler
nsq
.
Handler
}
// ConsumerPool 消费者池,用于管理多个消费者实例
type
ConsumerPool
struct
{
consumers
[]
*
nsq
.
Consumer
config
*
NsqConfig
}
// InitConsumer 初始化单个消费者
func
InitConsumer
(
consumer
*
NsqConfig
)
{
cfg
:=
nsq
.
NewConfig
()
cfg
.
LookupdPollInterval
=
time
.
Second
*
30
// 优化内存:限制MaxInFlight,避免过多消息堆积在内存中
if
consumer
.
MaxInFlight
>
0
{
cfg
.
MaxInFlight
=
consumer
.
MaxInFlight
}
else
{
cfg
.
MaxInFlight
=
1
// 默认最小值,减少内存占用
}
//设置重连时间
// 设置其他内存优化参数
cfg
.
DefaultRequeueDelay
=
time
.
Second
*
5
cfg
.
MaxRequeueDelay
=
time
.
Minute
cfg
.
ReadTimeout
=
time
.
Second
*
30
cfg
.
WriteTimeout
=
time
.
Second
*
10
c
,
err
:=
nsq
.
NewConsumer
(
consumer
.
Topic
,
consumer
.
Channel
,
cfg
)
// 新建一个消费者
if
logs
.
CheckErr
(
err
,
"InitConsumer"
)
{
return
...
...
@@ -38,28 +54,71 @@ func InitConsumer(consumer *NsqConfig) {
}
}
func
InitBatchConsumer
(
consumer
*
NsqConfig
,
clientNum
int
)
{
cfg
:=
nsq
.
NewConfig
()
// InitBatchConsumer 批量初始化消费者,优化内存使用
// consumerCount: 消费者实例数量
// totalWorkers: 总并发处理数
func
InitBatchConsumer
(
consumer
*
NsqConfig
,
consumerCount
int
,
totalWorkers
int
)
{
if
consumerCount
<=
0
{
consumerCount
=
1
}
if
totalWorkers
<=
0
{
totalWorkers
=
consumerCount
}
// 计算每个Consumer的并发数
workersPerConsumer
:=
totalWorkers
/
consumerCount
if
workersPerConsumer
<
1
{
workersPerConsumer
=
1
}
// 共享基础配置,减少内存占用
baseCfg
:=
nsq
.
NewConfig
()
baseCfg
.
LookupdPollInterval
=
time
.
Second
*
30
baseCfg
.
DefaultRequeueDelay
=
time
.
Second
*
5
baseCfg
.
MaxRequeueDelay
=
time
.
Minute
baseCfg
.
ReadTimeout
=
time
.
Second
*
30
baseCfg
.
WriteTimeout
=
time
.
Second
*
10
// 根据消费者数量分配MaxInFlight,避免内存过度使用
maxInFlightPerConsumer
:=
1
if
consumer
.
MaxInFlight
>
0
{
cfg
.
MaxInFlight
=
consumer
.
MaxInFlight
maxInFlightPerConsumer
=
consumer
.
MaxInFlight
/
consumerCount
if
maxInFlightPerConsumer
<
1
{
maxInFlightPerConsumer
=
1
}
cfg
.
LookupdPollInterval
=
time
.
Second
*
30
//设置重连时间
c
,
err
:=
nsq
.
NewConsumer
(
consumer
.
Topic
,
consumer
.
Channel
,
cfg
)
// 新建一个消费者
}
baseCfg
.
MaxInFlight
=
maxInFlightPerConsumer
if
logs
.
CheckErr
(
err
,
"InitConsumer"
)
{
return
pool
:=
&
ConsumerPool
{
consumers
:
make
([]
*
nsq
.
Consumer
,
0
,
consumerCount
),
config
:
consumer
,
}
if
clientNum
==
0
{
clientNum
=
1
for
i
:=
0
;
i
<
consumerCount
;
i
++
{
c
,
err
:=
nsq
.
NewConsumer
(
consumer
.
Topic
,
consumer
.
Channel
,
baseCfg
)
if
logs
.
CheckErr
(
err
,
"InitBatchConsumer"
)
{
continue
}
c
.
ChangeMaxInFlight
(
clientNum
)
//可以根据nsqds数量来配置
c
.
AddHandler
(
consumer
.
Handler
)
// 批量添加消费者接口
// 使用并发handlers,减少Consumer实例数量的同时保持高吞吐
if
workersPerConsumer
>
1
{
c
.
AddConcurrentHandlers
(
consumer
.
Handler
,
workersPerConsumer
)
}
else
{
c
.
AddHandler
(
consumer
.
Handler
)
}
//建立NSQLookupd连接
err
=
c
.
ConnectToNSQD
(
consumer
.
Addr
)
if
logs
.
CheckErr
(
err
,
"ConnectToNSQD"
)
{
return
continue
}
pool
.
consumers
=
append
(
pool
.
consumers
,
c
)
}
}
// Stop 停止所有消费者
func
(
p
*
ConsumerPool
)
Stop
()
{
for
_
,
c
:=
range
p
.
consumers
{
c
.
Stop
()
}
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论