Wizzercn / MqttWk

Java + Netty 实现的高并发高可用MQTT服务broker,轻松支持10万并发(有群友实现了130万在线)
Apache License 2.0
635 stars 229 forks source link

请问是否,要在publish或其他操作的时候,同步redis的过期时间? #16

Closed Aarthas closed 4 years ago

Aarthas commented 4 years ago

你好,向你请教一个问题:心跳 目前你是session信息存储到redis, 登录的时候,keepalive设置的是allIdleTime, channel.pipeline().addFirst("idle", new IdleStateHandler(0, 0, expire)); 设备每次ping的时候, 延长redis的key失效时间。sessionStoreService.expire(clientId, sessionStore.getExpire());

假如:设备的那次心跳,服务器没有收到,redis的session缓存就会过期,消失。但是期间设备一直有publish操作,则userEventTriggered的idle事件不会触发。导致设备实际在线,在上层应用看来(从redis判断),则是一致离线。

请问是否,要再publish或其他操作的时候,同步redis的过期时间?

Wizzercn commented 4 years ago

MQTT V3.1.1

QoS标志表明此主题范围内的消息传送到客户端所需的一致程度。 值 0:不可靠,消息基本上仅传送一次,如果当时客户端不可用,则会丢失该消息。 值 1:消息应传送至少 1 次。 值 2:消息仅传送一次。

Aarthas commented 4 years ago

没有理解我的意思,publish的时候,发现redis session过期了,不存在了如何处理?

为什么会过期呢,加入设备的心跳是60s,keepalive是90s,redis过期是90s。在60s的时候心跳丢失了,如果此时设备发了publish操作,则userEventTriggered不会在90s的时候执行,因为没有idle,然后90s的时候,redis缓存过期了。 如果在100s的时候,设备又发了publish,reids里没有session信息,此时该如何处理? 此时其他用户向此client发送信息,发现 reids里没有session信息,判断为离线,也发送不了。而实际是设备连着你的mqtt 服务器。

Wizzercn commented 4 years ago

那你把过期时间改成一致就好