面试题答案
一键面试运用中介者模式优化模块间通信
- 定义中介者接口:
public interface Mediator { void sendMessage(String message, SubModule sender); }
- 实现具体中介者:
import java.util.HashMap; import java.util.Map; public class ConcreteMediator implements Mediator { private Map<String, SubModule> subModuleMap = new HashMap<>(); public void registerSubModule(String name, SubModule subModule) { subModuleMap.put(name, subModule); } @Override public void sendMessage(String message, SubModule sender) { for (SubModule subModule : subModuleMap.values()) { if (subModule != sender) { subModule.receiveMessage(message); } } } }
- 定义子模块接口及实现:
public abstract class SubModule { protected Mediator mediator; protected String name; public SubModule(Mediator mediator, String name) { this.mediator = mediator; this.name = name; } public abstract void receiveMessage(String message); public void sendMessage(String message) { mediator.sendMessage(message, this); } } public class ConcreteSubModule extends SubModule { public ConcreteSubModule(Mediator mediator, String name) { super(mediator, name); } @Override public void receiveMessage(String message) { System.out.println(name + " received message: " + message); } }
- 使用示例:
public class Main { public static void main(String[] args) { ConcreteMediator mediator = new ConcreteMediator(); ConcreteSubModule subModule1 = new ConcreteSubModule(mediator, "SubModule1"); ConcreteSubModule subModule2 = new ConcreteSubModule(mediator, "SubModule2"); mediator.registerSubModule("SubModule1", subModule1); mediator.registerSubModule("SubModule2", subModule2); subModule1.sendMessage("Hello from SubModule1"); } }
处理高并发场景下中介者的性能瓶颈
- 线程池优化:在中介者的
sendMessage
方法中,使用线程池来异步处理消息发送,避免单个线程处理大量消息导致的阻塞。import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class ConcreteMediator implements Mediator { private Map<String, SubModule> subModuleMap = new HashMap<>(); private ExecutorService executorService = Executors.newFixedThreadPool(10); public void registerSubModule(String name, SubModule subModule) { subModuleMap.put(name, subModule); } @Override public void sendMessage(String message, SubModule sender) { for (SubModule subModule : subModuleMap.values()) { if (subModule != sender) { SubModule finalSubModule = subModule; executorService.submit(() -> finalSubModule.receiveMessage(message)); } } } }
- 缓存优化:对于一些频繁发送或处理的消息,可以使用缓存机制,减少重复处理。例如,使用
Guava Cache
。import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; public class ConcreteMediator implements Mediator { private Map<String, SubModule> subModuleMap = new HashMap<>(); private Cache<String, String> messageCache = CacheBuilder.newBuilder() .maximumSize(1000) .build(); public void registerSubModule(String name, SubModule subModule) { subModuleMap.put(name, subModule); } @Override public void sendMessage(String message, SubModule sender) { String cachedMessage = messageCache.getIfPresent(message); if (cachedMessage != null) { message = cachedMessage; } for (SubModule subModule : subModuleMap.values()) { if (subModule != sender) { subModule.receiveMessage(message); } } messageCache.put(message, message); } }
实现中介者的负载均衡
- 使用集群部署:将中介者进行集群部署,通过负载均衡器(如Nginx)将请求均匀分配到各个中介者实例上。
- 动态负载均衡算法:在负载均衡器中使用动态负载均衡算法,如加权轮询(Weighted Round Robin),根据每个中介者实例的性能指标(如CPU使用率、内存使用率等)动态调整权重,确保请求更合理地分配。
- 心跳检测:中介者实例定期向负载均衡器发送心跳消息,负载均衡器根据心跳情况判断中介者实例的健康状态,将不健康的实例从负载均衡池中移除,保证系统的稳定性。