Skip to main content

异步通信2:websocket

异步通信2: WebSocket

ws://host:port/path?query

wss : ws + ssl 443 port

全双工, 基于TCP

Websocket协议:

  1. handshake 可从http升级, 例如stomp
  2. data transfer

ws的java api:

  • java server : Endpoint类

  • encoder/decoder: Java Obj <-> bytes

  • Spring WebSocket STOMP协议

三种轮询对比分析:

  1. 在前端工程中,使用JavaScript监听订单处理结果消息发送到的Topic,然后刷新页面;
    • 优点: 资源占用小, 实时性高
    • 缺点: 兼容性差, 安全性差
  2. 在前端发送Ajax请求获取订单的最新状态,后端接收到请求后将订单状态返回给前端去显示;
    • 优点: 实现简单, 兼容性好
    • 缺点: 后端压力大, 实时性差, 资源浪费
  3. 采用WebSocket 方式,后端的消息监听器类监听到消息处理结果Topic 中的消息后,通过WebSocket发送给前端;
    • 优点:实时性强,server push减少请求次数
    • 缺点:连接管理复杂,浏览器支持差异,服务器资源占用(ws长连接), 调试带来的困难
  • 对实时性要求极高且服务器资源充足:推荐使用WebSocket方式,如在线游戏、实时聊天等场景。
  • 实时性要求较高且前端技术栈支持消息队列:可以考虑前端监听Topic方式,如一些需要实时处理消息的复杂业务系统。
  • 实时性要求一般且开发资源有限:Ajax轮询是一种简单易行的选择,适用于大多数普通的业务场景。

异步通信的优缺点总结:将下订单服务改写为基于异步通信的消息机制确实能够显著改善系统性能不佳的情况,原因如下:

  1. 提高系统吞吐量
  • 非阻塞操作:在传统的同步通信中,线程在等待I/O操作(如读取数据库或网络通信)时会处于阻塞状态,不能执行其他任务。而异步通信将这些长时间等待的操作变为非阻塞,释放了资源去处理其他任务,从而减少资源空闲时间,并增加单位时间内处理的任务数量。
  • 并行处理:异步通信允许系统在不同的时间处理不同的任务,而不是串行化地执行,使得系统可以更容易地水平扩展以应对不断增长的请求。
  1. 增强用户体验
  • 响应更快:通过异步方式加载网页中的内容,可以使得用户在等待特定部分内容加载的同时仍然能够与其他部分进行交互,从而让用户感觉到程序响应更快、更流畅。
  • 后台处理:在以用户界面为导向的应用程序中,比如在线编辑器或游戏中,异步通信使得后台处理(如自动保存、游戏状态更新)能够在不干扰用户当前操作的情况下进行。这种方式提供了一种无缝交互体验,有助于用户专注于核心任务而不是等待进程的完成。
  1. 促进资源的高效利用
  • 减少上下文切换:异步架构避免了频繁的上下文切换和同步锁的开销,因为线程可以在I/O操作执行期间处理其他任务而不是处于等待状态。这种方法使得CPU和内存资源得到更高效的使用,特别是在云计算环境中,资源使用效率直接关联到成本。
  • 资源复用:在基于微服务的架构中,各个微服务通常通过异步消息传递进行通信,这意味着一个服务可以将消息发送到消息队列,然后立即返回执行其他任务,而不用等待消息的接收和处理。通过这种方式,至关重要的系统资源得到了有效的复用,且系统整体的扩展性也得到加强。
  1. 降低系统耦合度
  • 解耦合:异步通信通过减少组件之间的直接交互来降低系统的耦合度。在异步通信模型中,通常采用了事件、消息或回调来触发不同组件间的交互,并不直接调用其他组件的接口。这种机制意味着一个组件的改变不太可能影响到其他组件的功能,进而提高了系统的灵活性和可维护性。
  1. 提升系统的可伸缩性
  • 水平扩展:系统的可伸缩性与其处理高并发的能力密切相关,而异步通信机制是提升并发处理能力的关键。通过异步模型,系统可以在不同的时间处理不同的任务,而不是串行化地执行,使得系统可以更容易地水平扩展以应对不断增长的请求。
  • 分布式处理:在分布式系统中,异步通信允许无缝地添加更多的节点来处理额外的负载。这些节点可以通过异步消息队列与已有的系统其他部分进行通信,有效分散请求量,避免了单点过载和性能瓶颈。这种灵活性为应对未来可能出现的流量波峰提供了预备能力。
  1. 天然实现“削峰填谷”功能
  • 缓冲机制:消息队列服务会将消息持久化存储在磁盘中,在高峰期来不及处理的消息,会在低谷期被消费者服务处理完。通常,消息队列会使用廉价、高容量的机械磁盘存放消息,可以轻松缓存住高峰期超载的全部请求。
  1. 提高系统可用性
  • 持久化存储:持久化到磁盘中的消息,在宕机故障时比内存中的请求有更高的可用性。
  • 故障隔离:消息队列可以隔离故障,比如,消费者服务宕机后,生产者服务短期内不会受到影响。
  • 服务降级:当总吞吐量超过性能上限时,还可以设置不同的消息优先级,通过服务降级保障系统的基本可用性。
  1. 低成本监控
  • 实时运行状态:消息队列服务对于各种消息的发布、消费情况都有统计,因此,从消息中就能获得业务的实时运行状态,以极低的成本实现系统的监控。