Design Pattern -High performance Dispatcher Pattern

高性能的Dispatcher模式

在👉 Design Pattern - Dispatcher Pattern 文章中初步搭建了Dispatcher模式框架,本文将进一步聊下如何处理大量并发请求场景,为聊 Java IO-Netty 在做一层铺垫

AI图片

引言

在构建现代软件系统时,尤其是在需要处理大量并发请求的场景下,如何高效地分发和处理事件成为系统设计的关键。本文将探讨一种高性能的Dispatcher模式,通过引入线程池和并发控制,提高系统的响应速度和处理能力。

快速回顾

核心组件

  1. 事件(Event):封装了事件的详细信息。
  2. 事件处理器(EventListener):定义了处理事件的接口。
  3. 事件分发器(EventDispatcher):负责维护事件与处理器的映射关系,并分发事件。

基础Dispatcher模式框架

详情请查阅 👉Design Pattern - Dispatcher Pattern

  1. import java.util.HashMap;
  2. import java.util.Map;
  3. public class EventDispatcher {
  4. private Map<String, EventListener> listeners = new HashMap<>();
  5. public void registerListener(String eventType, EventListener listener) {
  6. listeners.put(eventType, listener);
  7. }
  8. public void dispatchEvent(Event event) {
  9. EventListener listener = listeners.get(event.getEventType());
  10. if (listener != null) {
  11. listener.onEvent(event);
  12. } else {
  13. System.out.println("No listener for event: " + event.getEventType());
  14. }
  15. }
  16. }

优化

根据分发器(EventDispatcher)和接收者(EventListener)的同步性和异步性,我们可以将Dispatcher模式分为四种类型:

1. 同步分发器与同步接收者

描述:

  • 分发器:在接收到事件后,立即将事件分发给接收者,并等待接收者处理完成。
  • 接收者:处理事件并立即返回结果。

特点:

  • 简单直观,易于实现和理解。
  • 处理事件时会阻塞分发器,不适合高并发环境。

示例代码:

  1. public void dispatchEvent(Event event) {
  2. EventListener listener = listeners.get(event.getType());
  3. if (handler != null) {
  4. listener.onEvent(event);
  5. }
  6. }

2. 同步分发器与异步接收者

描述:

  • 分发器:同步地将事件分发给接收者,但接收者可能异步处理事件。
  • 接收者:接收事件后,可能立即处理,也可能将事件放入队列或线程池异步处理。

特点:

  • 分发器不需要等待事件处理完成,可以继续接收其他事件。
  • 接收者可以异步处理事件,提高了并发处理能力。

示例代码:

  1. public void dispatchEvent(Event event) {
  2. EventListener listener = listeners.get(event.getType());
  3. if (listener != null) {
  4. listener.onEventAsync(event);
  5. }
  6. }

3. 异步分发器与同步接收者

描述:

  • 分发器:将事件的分发过程异步化,通常使用线程池来并行分发事件。
  • 接收者:同步处理接收到的事件。

特点:

  • 分发器可以快速分发事件,不受事件处理时间的影响。
  • 接收者可能成为性能瓶颈,如果处理速度跟不上事件的接收速度。

示例代码:

  1. public void dispatchEvent(Event event) {
  2. executorService.submit(() -> {
  3. EventListener listener = listeners.get(event.getType());
  4. if (listener != null) {
  5. listener.onEvent(event); // 同步处理
  6. }
  7. });
  8. }

4. 异步分发器与异步接收者

描述:

  • 分发器:异步地将事件分发给接收者,通常使用线程池。
  • 接收者:异步处理事件,可能使用内部的异步逻辑或线程池。

特点:

  • 整个事件处理流程都是异步的,最大化地提高了并发处理能力和响应速度。
  • 对资源管理要求较高,需要合理控制线程池大小和资源使用。

示例代码:

  1. public void dispatchEvent(Event event) {
  2. executorService.submit(() -> {
  3. EventListener listener = listeners.get(event.getType());
  4. if (listener != null) {
  5. listener.onEventAsync(event); // 异步处理
  6. }
  7. });
  8. }

总结

Dispatcher模式通过引入线程池和异步处理机制,可以显著提高系统的并发处理能力。在选择实现方式时,应根据系统的具体需求和资源状况来决定使用哪种类型的Dispatcher模式。在面对高并发挑战时,异步分发器与异步接收者的组合提供了一种有效的解决方案。通过合理地应用这些技术,我们可以构建出既快速又可靠的软件系统。

小扩展

如果将 同步/异步阻塞/非阻塞的特性分别应用到分发器(Dispatcher)和接收者(Receiver)时,变可以创建一个4x4的矩阵,从而得到16种不同的组合类型💪。以下是每种组合的分类:

  1. 同步阻塞分发器 + 同步阻塞接收者:分发器在事件发出后等待接收者的响应,接收者处理事件后返回结果,两者都阻塞等待。
  2. 同步阻塞分发器 + 同步非阻塞接收者:分发器等待接收者响应,接收者可以处理其他事件而不会阻塞当前事件的响应。
  3. 同步阻塞分发器 + 异步阻塞接收者:分发器等待接收者响应,接收者异步处理事件,但在返回结果前阻塞。
  4. 同步阻塞分发器 + 异步非阻塞接收者:分发器等待接收者响应,接收者异步处理事件且不会阻塞。
  5. 同步非阻塞分发器 + 同步阻塞接收者:分发器发出事件后不等待响应,接收者同步阻塞处理事件。
  6. 同步非阻塞分发器 + 同步非阻塞接收者:分发器发出事件后不等待响应,接收者同步处理但不阻塞。
  7. 同步非阻塞分发器 + 异步阻塞接收者:分发器发出事件后不等待响应,接收者异步处理但在返回结果前阻塞。
  8. 同步非阻塞分发器 + 异步非阻塞接收者:分发器发出事件后不等待响应,接收者异步处理且不阻塞。
  9. 异步阻塞分发器 + 同步阻塞接收者:分发器发出事件后继续处理其他任务,等待接收者的响应,接收者同步阻塞处理。
  10. 异步阻塞分发器 + 同步非阻塞接收者:分发器发出事件后继续处理其他任务,接收者同步处理但不阻塞。
  11. 异步阻塞分发器 + 异步阻塞接收者:分发器发出事件后继续处理其他任务,等待接收者的响应,接收者异步处理但在返回结果前阻塞。
  12. 异步阻塞分发器 + 异步非阻塞接收者:分发器发出事件后继续处理其他任务,接收者异步处理且不会阻塞。
  13. 异步非阻塞分发器 + 同步阻塞接收者:分发器发出事件后不等待,接收者同步阻塞处理。
  14. 异步非阻塞分发器 + 同步非阻塞接收者:分发器发出事件后不等待,接收者同步处理但不阻塞。
  15. 异步非阻塞分发器 + 异步阻塞接收者:分发器发出事件后不等待,接收者异步处理但在返回结果前阻塞。
  16. 异步非阻塞分发器 + 异步非阻塞接收者:分发器发出事件后不等待,接收者异步处理且不阻塞。