MQTT协议原理及应用

MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅(Pub-Sub)模式的轻量级消息传输协议,专为低带宽、不可靠网络环境资源受限设备设计。它广泛应用于物联网(IoT)、实时通信、传感器网络等领域。


一、MQTT协议核心原理

1. 协议定位

  • 轻量级:专为低带宽、高延迟或不可靠网络设计,报文头最小仅2字节。
  • 发布/订阅模型:解耦消息生产者(Publisher)与消费者(Subscriber),通过主题(Topic)路由消息。
  • TCP/IP基础:基于TCP长连接,默认端口1883(非加密)/8883(SSL加密)。

2. 核心组件

组件 功能描述
Broker 消息代理服务器,负责消息路由、客户端管理和会话状态维护(如EMQX、Mosquitto)
Publisher 消息发布者,向指定主题发送数据
Subscriber 消息订阅者,通过订阅主题接收数据
Topic 分层结构的消息路由标识(如iot/device001/temperature
阅读全文

WebSocket高并发优化

WebSocket 高并发场景的优化需要从 协议特性架构设计代码实现基础设施 四个层面综合优化。以下是完整技术方案:


一、协议层优化策略

优化方向 技术手段 性能提升效果
二进制帧压缩 启用permessage-deflate扩展(RFC 7692)压缩数据载荷 减少50%-70%网络传输量
心跳机制 合理设置PING/PONG间隔(建议30-60秒),及时清理僵尸连接 降低无效连接资源占用
分帧传输 大数据包分片(FIN=0中间帧 + FIN=1结束帧),避免单帧阻塞 提升并发吞吐量
协议升级 使用WebSocket over HTTP/2,复用多路流(需支持RFC 8441) 减少TCP连接数,提高连接效率

示例:启用压缩

1
2
3
4
5
6
7
8
9
// Node.js(ws库)
const WebSocket = require('ws');
const wss = new WebSocket.Server({
port: 8080,
perMessageDeflate: {
zlibDeflateOptions: { level: 3 },
threshold: 1024 // 仅压缩>1KB的数据
}
});
阅读全文

WebSocket工作原理

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,旨在为现代 Web 应用提供实时、高效的双向通信能力。以下将详细介绍 WebSocket 的工作原理及其常见的应用场景。

一、WebSocket 的工作原理

1. 握手阶段(Handshake)

WebSocket 的通信始于一个 HTTP 握手请求,客户端通过发送一个特殊的 HTTP 请求来请求升级协议到 WebSocket。具体步骤如下:

客户端发起握手请求
客户端发送一个 HTTP 请求,包含以下关键头部字段:

1
2
3
4
5
6
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

其中:
Upgrade: websocketConnection: Upgrade 表示客户端希望将协议升级为 WebSocket。
Sec-WebSocket-Key 是一个随机生成的 Base64 编码字符串,用于验证服务器的响应。

阅读全文

Spring如何解决循环依赖

Spring 框架通过 三级缓存 的机制,巧妙地解决了 循环依赖 的问题。以下是详细的解释和实现原理:


1. 什么是循环依赖?

循环依赖指的是两个或多个 Bean 相互依赖,形成闭环,例如:

1
2
3
4
5
6
7
8
9
10
11
@Service
public class A {
@Autowired
private B b;
}

@Service
public class B {
@Autowired
private A a;
}

在上述代码中,A 依赖 B,同时 B 又依赖 A,形成了循环依赖。

阅读全文

如何设计电商系统架构

设计一个高并发高可用的电商系统架构需要综合考虑性能、可扩展性、安全性和容错能力。以下是一个典型的电商高并发高可用架构设计,涵盖了从用户请求到后端服务的各个环节。

1. 前端层

  • CDN(内容分发网络):使用CDN加速静态资源(如图片、CSS、JavaScript文件)的加载,减少服务器负载,提高用户访问速度。
  • 负载均衡器:使用Nginx、HAProxy或AWS ELB等负载均衡器,将用户请求分发到多个Web服务器,确保高可用性和负载均衡。

2. 应用层

  • Web服务器:使用Nginx、Apache等Web服务器处理HTTP请求,反向代理到应用服务器。
  • 应用服务器:采用微服务架构,将电商系统拆分为多个独立的服务,如用户服务、商品服务、订单服务、支付服务等。每个服务可以独立部署和扩展。
  • API网关:统一管理外部请求,进行身份验证、流量控制、日志记录等。常用的API网关有Kong、Zuul等。
阅读全文

如何设计秒杀系统

设计一个秒杀系统需要解决高并发、低延迟、数据一致性和系统稳定性等核心问题。以下是针对秒杀系统的详细设计方案:


1. 需求分析

  • 业务场景:短时间内大量用户抢购限量商品,如电商大促、票务活动等。
  • 核心挑战
    • 高并发:瞬间流量可能达到数十万甚至百万级别。
    • 性能瓶颈:数据库、缓存、网络带宽等可能成为瓶颈。
    • 数据一致性:防止超卖和重复抢购。
    • 用户体验:确保用户能快速看到结果,避免页面卡顿。
阅读全文

MySQL和PostgreSQL语法特性对比

MySQL 和 PostgreSQL 是目前两大主流的数据库,MySQL 以简单易用和高性能著称,适合中小型 Web 应用和读写分离场景;PostgreSQL 则以其强大的功能(如 JSONB、窗口函数、递归查询)和高并发事务支持,更适合复杂查询、数据分析和高可靠系统。以下分别从语法特性、适用场景以及 SQL 示例对比两者的差异:


1. 语法特性对比

(1)数据类型

特性 MySQL PostgreSQL
布尔类型 TINYINT(1) 模拟 原生支持 BOOLEAN
JSON 支持 MySQL ≥5.7 支持 JSON 原生支持 JSON/JSONB(支持更复杂查询)
数组类型 不支持,需字符串模拟 原生支持数组(如 INT[]TEXT[]
UUID 不支持(需字符串存储) 原生支持 UUID 类型
枚举类型 支持 ENUM 支持 ENUM(需自定义类型)
阅读全文

Web安全技术介绍

CORS、XSS 和 CSRF 是三种常见的 Web 安全相关技术或漏洞,它们分别涉及不同的安全机制和攻击方式。以下是它们的区别和联系:


1. CORS(跨域资源共享,Cross-Origin Resource Sharing)

定义

CORS 是一种浏览器机制,用于控制跨域请求的访问权限。它允许服务器指定哪些外部域名可以访问其资源。

作用

  • 解决浏览器的同源策略(Same-Origin Policy)限制。
  • 允许安全的跨域请求(如 API 调用)。

关键点

  • 服务器控制:通过 HTTP 响应头(如 Access-Control-Allow-Origin)指定允许访问的域名。
  • 预检请求:对于复杂请求(如带有自定义头的请求),浏览器会先发送一个 OPTIONS 请求进行预检。
  • 安全问题:如果 CORS 配置不当,可能导致敏感数据泄露。

示例

1
Access-Control-Allow-Origin: https://example.com
阅读全文

MySQL的索引分类

MySQL中的索引是用于加速数据检索的数据结构。合理地使用索引可以显著提高查询性能,但索引也会增加写操作(如INSERTUPDATEDELETE)的开销。以下是MySQL中常见的索引类型及其特点:


1. 主键索引(Primary Key Index)

  • 特点
    • 每张表只能有一个主键索引。
    • 主键索引的值必须是唯一的且不能为NULL
    • 主键索引是聚集索引(Clustered Index),即数据行的物理存储顺序与索引顺序一致。
  • 使用场景
    • 用于唯一标识表中的每一行数据。
  • 示例
    1
    2
    3
    4
    CREATE TABLE users (
    id INT PRIMARY KEY, -- 主键索引
    name VARCHAR(50)
    );
阅读全文

MySQL的锁机制

MySQL中的锁机制是用于管理并发访问的重要工具,确保数据的一致性和完整性。MySQL的锁可以分为多种类型,根据锁的粒度、行为和用途进行分类。以下是MySQL中常见的锁类型及其特点:


1. 按锁的粒度分类

锁的粒度指的是锁定的数据范围大小。MySQL支持以下锁粒度:

(1) 表级锁(Table-Level Lock)

  • 特点
    • 锁定整张表。
    • 开销小,加锁快,但并发度低。
  • 使用场景
    • 适用于MyISAM存储引擎。
    • InnoDB中,表级锁通常用于DDL操作(如ALTER TABLE)。
  • 示例
    1
    2
    3
    LOCK TABLES table_name READ;  -- 加读锁
    LOCK TABLES table_name WRITE; -- 加写锁
    UNLOCK TABLES; -- 释放锁
阅读全文