前言 之前看了一些关于Mqtt协议的文章,看完了没有去做笔记,过了这么久忘了很多。最近刚好在做相关的东西,需要用到,就顺便记下来了。 正文 cleansession 清除会话 在客户端连接服务端时设置。 值为:true/false 作用:服务器必须在客户端断开之后继续存储/保持客户端的订阅状态,包括以下状态 存储订阅的消息Qos1和Qos2消息,当客户端重新订阅时发送 服务端正在发送消息给客户端期间连接丢失导致发送失败的消息 retain 持久消息。 想一下以下场景,你有个温湿度传感器,每隔几个钟向主题发送一次消息,此时你有个新的客户端订阅了这个主题,那它难道要等上几个钟才能获得消息吗?可不可以一订阅就获取上一次发送的消息呢? 答案是可以的 值为: true/false 作用:表示发送的消息需要一直持久保存(不受服务器重启影响),不但要发送给当前的订阅者,并且以后新来的订阅了此Topic name的订阅者会马上得到推送。 注意:新来的订阅了此topic name的订阅者指的是新的clientID用户,也就是说假如你是叫12345的用户在同一次的连接中多次重复订阅的话是和订阅一次一样的;.... Mqtt协议——cleansession、retain、will、Shared Subscription mqtt
遗嘱消息是 MQTT 为那些可能出现 意外断线 的设备提供的将 遗嘱 优雅地发送给第三方的能力。意外断线包括但不限于: 因网络故障或网络波动,设备在保持连接周期内未能通讯,连接被服务端关闭 设备意外掉电 设备尝试进行不被允许的操作而被服务端关闭连接,例如订阅自身权限以外的主题等 遗嘱消息可以看作是一个简化版的 PUBLISH 消息,他也包含 Topic, Payload, QoS 等字段。遗嘱消息会在设备与服务端连接时,通过 CONNECT 报文指定,然后在设备意外断线时由服务端将该遗嘱消息发布到连接时指定的遗嘱主题(Will Topic)上。这也意味着服务端必须在回复 CONNACK 之前完成遗嘱消息的存储,以确保之后任一时刻发生意外断线的情况,服务端都能保证遗嘱消息被发布。 以下为遗嘱消息在 MQTT 5.0 和 MQTT 3.1 & 3.1.1 的差异: MQTT 5.0 MQTT 3.1 & 3.1.1 Will Retain Yes Yes Will QoS Yes Yes Will Flag Yes Yes Will Properties Yes No Wi.... MQTT 遗嘱消息(Will Message)的使用 emqx
基于MQTT 3.1版本,标准MQTT发布遗嘱消息的几种情况。 如果想设置遗嘱消息,那么客户端请求和代理服务器链接之前,必须把遗嘱消息提前填写好,在请求连接时,把遗嘱消息发给代理服务器。 MQTT遗嘱消息,什么时候订阅者会收到代理服务器发布的遗嘱消息?以下四种情况: 服务端发生了I/O 错误或者网络失败; 客户端在定义的心跳时期失联; 客户端在发送下线包之前关闭网络连接; 服务端在收到下线包之前关闭网络连接。 遗嘱标志 Will Flag 位置: 连接标志的第2位。 遗嘱标志( Will Flag) 被设置为1, 表示如果连接请求被接受了, 遗嘱( Will Message) 消息必须被存储在服务端并且与这个网络连接关联。 之后网络连接关闭时, 服务端必须发布这个遗嘱消息, 除非服务端收到DISCONNECT报文时删除了这个遗嘱消息。 遗嘱消息发布的条件, 包括但不限于: 服务端检测到了一个I/O错误或者网络故障。 客户端在保持连接( Keep Alive) 的时间内未能通讯。 客户端没有先发送DISCONNECT报文直接关闭了网络连接。 由于协议错误服务端关闭了网络连接。 如果遗嘱.... MQTT 遗嘱消息(Will Message)发布 mqtt
背景 症状 排查 修复 背景 最近在陆续做机房升级相关工作,配合DBA对产线数据库链接方式做个调整,将原来直接链接读库的地址切换到统一的读负载均衡的代理 haproxy 上,方便机柜和服务器的搬迁。 切换之后线上时不时的会发生 discard connection 错误,导致程序报 500 错误,但不是每次都必现的。 开发框架: spring boot+mybatis+druid+shardingJDBC 网络架构: appserver->mysql(master) 写 appserver->haproxy->mysql(slave)/n 读 第一反应肯定是因为这次的读库地址的变动引起的问题,觉得问题应该是 druid 链接池中的 connection 保活策略没起作用,只要做下配置修改应该就可以了。结果这个问题让我们排查了好几天,我们竟然踩到了千年难遇的深坑。 这个问题排查的很坎坷,一次次的吐血,最终我们定位到问题并且优雅的修复了,我们一起来体验下这个一次一次让你绝望一次一次打脸的过程。 症状 先说故障症状,经常出现如下错误: discard connect.... 诡异的druid链接池链接断开故障经验总结 druid
Python flask设置favicon.ico图标,如图: import os from flask import Flask from flask import send_from_directory from flask import request app = Flask(__name__) @app.route('/favicon.ico')#设置icon def favicon(): return send_from_directory(os.path.join(app.root_path, 'static'),#对于当前文件所在路径,比如这里是static下的favicon.ico 'favicon.ico', mimetype='image/vnd.microsoft.icon') @app.route('/') def hello_world(): name=request.args.get("name")#获取参数对应值 return name if __name__ == '__main__': app.run(host='127.0.0.1',port=50.... Python flask设置favicon.ico图标 python
concurrent.futures的作用: ** 管理并发任务池** 。concurrent.futures模块提供了使用工作线程或进程池运行任务的接口。线程和进程池API都是一样,所以应用只做最小的修改就可以在线程和进程之间地切换 1、基于线程池使用map() #!/usr/bin/env python # -*- coding: utf-8 -*- from concurrent import futures import threading import time def task(n): print('{}: 睡眠 {}'.format(threading.current_thread().name,n)) time.sleep(n / 10) print('{}: 执行完成 {}'.format(threading.current_thread().name,n)) return n / 10 ex = futures.ThreadPoolExecutor(max_workers=2) print('main: 开始运行') results = ex.map(task, r.... Python之concurrent.futures模块的使用 python