当前位置: 首页 > news >正文

ps个人网站首页怎么制作网络营销的八种方法

ps个人网站首页怎么制作,网络营销的八种方法,求一个全部用div做的网站,做粤菜的视频网站在 Java 项目中实现消息推送服务,后端核心需要解决实时性、可靠性、扩展性(集群支持)和连接管理四大问题。以下从技术选型、核心架构、关键实现和注意事项四个方面展开说明:一、技术选型:根据场景选协议消息推送的核心…

在 Java 项目中实现消息推送服务,后端核心需要解决实时性可靠性扩展性(集群支持)和连接管理四大问题。以下从技术选型、核心架构、关键实现和注意事项四个方面展开说明:

一、技术选型:根据场景选协议

消息推送的核心是服务器主动向客户端发送数据,需根据实时性、客户端类型(Web/APP/ 物联网设备)选择合适的通信协议:

协议 / 方案适用场景优势劣势Java 技术栈支持
WebSocketWeb 端实时通信(如聊天、通知)全双工、低延迟、长连接部分老旧浏览器不支持Spring WebSocket、Netty、Tomcat 原生
MQTT物联网设备(低带宽、不稳定网络)轻量、支持 QoS(消息质量等级)需额外部署 MQTT broker(如 EMQX)Eclipse Paho、Spring Integration
长轮询(Long Polling)兼容性要求高的场景(如老浏览器)实现简单、兼容性好延迟较高、服务器资源消耗大Servlet + 异步处理
Server-Sent Events (SSE)服务器单向推送(如实时日志)轻量、仅服务器向客户端推送不支持客户端向服务器发送数据Spring WebFlux、原生 Servlet

二、核心架构:后端模块设计

无论选择哪种协议,消息推送服务的后端架构通常包含以下核心模块:

┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│   业务系统API   │───>│   消息路由模块   │───>│   连接管理模块   │───> 客户端
└─────────────────┘    └─────────────────┘    └─────────────────┘│                       │                       │▼                       ▼                       ▼
┌─────────────────┐    ┌─────────────────┐    ┌─────────────────┐
│  离线消息存储    │<───│  集群通信模块    │<───│  会话管理模块    │
└─────────────────┘    └─────────────────┘    └─────────────────┘
  1. 业务系统 API:提供接口给业务系统(如订单系统、通知系统)调用,触发消息推送(例如:pushMessage(String userId, String content))。

  2. 会话管理模块:维护客户端与服务器的连接会话(Session),核心是用户 ID 与连接的映射关系

    • 单机:用ConcurrentHashMap<String, Session>存储(key 为用户 ID,value 为连接会话)。
    • 集群:用 Redis 存储分布式会话(需序列化 Session 信息,或仅存储 “用户 ID - 节点 IP” 映射)。
  3. 连接管理模块:处理客户端的连接建立、断开、心跳检测。

    • 例如 WebSocket 的onOpen()(建立连接时绑定用户 ID 与 Session)、onClose()(移除映射)、onError()(异常处理)。
  4. 消息路由模块:根据目标用户 ID,找到对应的连接会话并发送消息。

    • 单机:直接从本地ConcurrentHashMap获取 Session 发送。
    • 集群:通过 Redis Pub/Sub 广播消息,所有节点收到后检查本地是否有目标用户的连接,有则发送。
  5. 离线消息模块:当用户不在线时,将消息暂存(如 MySQL、MongoDB 或 Kafka),待用户上线后拉取。

  6. 集群通信模块:解决多节点部署时的消息同步问题(如 Redis Pub/Sub、RabbitMQ 的 Fanout 交换机)。

三、关键实现:以 WebSocket + Spring Boot 为例

以最常用的 Web 端实时推送为例,基于 Spring Boot + WebSocket + Redis(集群支持)实现核心流程:

1. 依赖配置(Maven)
<!-- WebSocket核心依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- Redis(集群通信与会话存储) -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2. WebSocket 配置(连接建立与处理器)
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Autowiredprivate MessageHandler messageHandler; // 自定义消息处理器@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {// 配置WebSocket端点:客户端通过ws://ip:port/ws?token=xxx连接registry.addHandler(messageHandler, "/ws").setAllowedOrigins("*") // 允许跨域(生产环境需限制域名).addInterceptors(new HandshakeInterceptor() {// 握手前验证用户(如Token解析用户ID)@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) {String token = ((ServletServerHttpRequest) request).getServletRequest().getParameter("token");String userId = parseToken(token); // 解析Token获取用户IDif (userId == null) {response.setStatusCode(HttpStatus.UNAUTHORIZED);return false; // 验证失败,拒绝连接}attributes.put("userId", userId); // 存储用户ID到属性中return true;}@Overridepublic void afterHandshake(...) {}});}
}
3. 消息处理器(连接管理与会话绑定)
@Component
public class MessageHandler extends TextWebSocketHandler {// 本地会话映射:用户ID -> WebSocket会话(单机用)private final Map<String, WebSocketSession> localSessions = new ConcurrentHashMap<>();@Autowiredprivate StringRedisTemplate redisTemplate; // Redis操作模板@Autowiredprivate OfflineMessageService offlineMessageService; // 离线消息服务// 连接建立时:绑定用户ID与Session@Overridepublic void afterConnectionEstablished(WebSocketSession session) {String userId = (String) session.getAttributes().get("userId");localSessions.put(userId, session);// 1. 拉取离线消息并推送List<Message> offlineMessages = offlineMessageService.getByUserId(userId);for (Message msg : offlineMessages) {sendMessage(session, msg.getContent());}offlineMessageService.deleteByUserId(userId); // 清除已推送的离线消息// 2. 集群:将用户ID与当前节点IP存入Redis(便于其他节点定位)redisTemplate.opsForValue().set("user:session:" + userId, getLocalIp());}// 连接关闭时:移除会话映射@Overridepublic void afterConnectionClosed(WebSocketSession session, CloseStatus status) {String userId = (String) session.getAttributes().get("userId");localSessions.remove(userId);redisTemplate.delete("user:session:" + userId); // 集群:删除Redis映射}// 发送消息到指定用户(核心方法)public void pushToUser(String userId, String content) {// 1. 先检查本地是否有该用户的连接WebSocketSession session = localSessions.get(userId);if (session != null && session.isOpen()) {sendMessage(session, content);return;}// 2. 集群:检查用户是否连接在其他节点String targetNodeIp = redisTemplate.opsForValue().get("user:session:" + userId);if (targetNodeIp != null) {// 发布消息到Redis频道,目标节点订阅后发送redisTemplate.convertAndSend("push:channel", JSON.toJSONString(new PushMessage(userId, content)));return;}// 3. 用户不在线:存入离线消息offlineMessageService.save(new Message(userId, content, LocalDateTime.now()));}// 实际发送消息(封装异常处理)private void sendMessage(WebSocketSession session, String content) {try {session.sendMessage(new TextMessage(content));} catch (IOException e) {log.error("消息发送失败", e);}}
}
4. 集群支持:Redis Pub/Sub 订阅
@Component
public class RedisMessageListener {@Autowiredprivate MessageHandler messageHandler;@Beanpublic RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory(connectionFactory);// 订阅推送频道,接收其他节点的消息container.addMessageListener((message, pattern) -> {String json = new String(message.getBody());PushMessage pushMsg = JSON.parseObject(json, PushMessage.class);// 调用本地消息处理器发送(此时用户应在当前节点)messageHandler.pushToUser(pushMsg.getUserId(), pushMsg.getContent());}, new ChannelTopic("push:channel"));return container;}
}
5. 业务调用接口
@RestController
@RequestMapping("/api/message")
public class MessageController {@Autowiredprivate MessageHandler messageHandler;// 业务系统调用此接口触发推送@PostMapping("/push")public Result push(@RequestBody PushRequest request) {messageHandler.pushToUser(request.getUserId(), request.getContent());return Result.success();}
}

四、注意事项

  1. 安全性

    • 连接建立时必须验证用户身份(如 Token、Session),防止未授权连接。
    • 生产环境需限制 WebSocket 的跨域来源(setAllowedOrigins不要用*)。
  2. 可靠性

    • 实现消息确认机制(客户端收到消息后回复 ACK,服务器未收到则重试)。
    • 离线消息需持久化(建议用 Kafka 或数据库,支持消息过期清理)。
  3. 性能与扩展

    • 长连接数量大时,用 Netty 替代 Tomcat 原生 WebSocket(Netty 的 NIO 模型更高效)。
    • 集群部署时,通过 Redis 或 MQ 实现消息广播,避免 “消息孤岛”。
  4. 监控与运维

    • 监控连接数、消息发送成功率、节点负载(如用 Prometheus + Grafana)。
    • 实现连接心跳检测(定期发送 ping 帧,超时未响应则主动断开)。

总结

后端消息推送服务的核心是 **“连接管理”+“消息路由”**,小规模场景可用 Spring WebSocket + 本地会话;中大规模集群需结合 Redis 实现分布式会话与跨节点通信;物联网场景优先选 MQTT 协议。根据实时性和规模需求,可逐步迭代优化(从单机到集群,从基础功能到可靠性保障)。

http://www.dtcms.com/a/428225.html

相关文章:

  • 如何选择企业网站开发商贸有限公司英文
  • 901-012_高级系统架构设计师-考试范围-标准化知识产权数学模型汇总
  • 网站关键词搜索老酒街wordpress
  • Qwen-Image:开源图像生成新突破 —— 聚焦复杂文本渲染与精准图像编辑
  • 深圳自己做网站网站app开发一站式服务
  • 档案管理系统如何对企业效率重构与提升?
  • 中国移动网站建设番禺区手机版网站建设
  • 老庙出海 以东方好运文化讲好中国故事
  • 有关网站开发的参考文献怎么自己制作app
  • 【Linux指南】Linux调试利器gdb入门:从编译到基础命令实战
  • 住房建设网站用什么技术来做网站
  • 如何对接API接口?需要用到哪些软件工具?
  • App防止恶意截屏功能的方法:iOS、Android和鸿蒙系统的实现方案
  • 做阅读理解的网站兰州专业做网站的公司有哪些
  • windows输入法中英切换(英文提示)ALT + SHIFT切换(搜狗输入法CTRL+SHIFT+E切换)英文键盘
  • 国外支付对接流程记录
  • SRE角度的LSTM学习
  • 外贸网站案例wapcms建站系统
  • 网站服务器失去响应怎么解决wordpress 百度分享
  • 【鬼灭之刃无限城篇4k高清版】免费分享
  • Java8 Function、Consumer、Supplier
  • 网站美化模板长治做网站哪家好
  • UVa11211 Digital Logic
  • 在门户网站做产品seowordpress 上传中文文件名
  • 营销网站建站开发整站seo策略实施
  • Day04_总线驱动
  • 成都市成华区建设局官方网站wordpress啦去
  • 901-008_高级系统架构设计师-考试范围-系统质量属性与架构评估
  • 重庆做网站seo优化选哪家好php数据库的网站模板
  • RMBG2.0 vs. BiRefNet_HR:从「人像抠图」到「万物分割」