MST

星途 面试题库

面试题:Java中介者模式在复杂系统中的优化应用

假设你正在开发一个大型的Java分布式系统,系统中有多个子模块需要相互通信。请详细描述如何运用中介者模式来优化模块间的通信,包括如何处理高并发场景下中介者可能出现的性能瓶颈,以及如何实现中介者的负载均衡。
44.5万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

运用中介者模式优化模块间通信

  1. 定义中介者接口
    public interface Mediator {
        void sendMessage(String message, SubModule sender);
    }
    
  2. 实现具体中介者
    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);
                }
            }
        }
    }
    
  3. 定义子模块接口及实现
    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);
        }
    }
    
  4. 使用示例
    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");
        }
    }
    

处理高并发场景下中介者的性能瓶颈

  1. 线程池优化:在中介者的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));
                }
            }
        }
    }
    
  2. 缓存优化:对于一些频繁发送或处理的消息,可以使用缓存机制,减少重复处理。例如,使用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);
        }
    }
    

实现中介者的负载均衡

  1. 使用集群部署:将中介者进行集群部署,通过负载均衡器(如Nginx)将请求均匀分配到各个中介者实例上。
  2. 动态负载均衡算法:在负载均衡器中使用动态负载均衡算法,如加权轮询(Weighted Round Robin),根据每个中介者实例的性能指标(如CPU使用率、内存使用率等)动态调整权重,确保请求更合理地分配。
  3. 心跳检测:中介者实例定期向负载均衡器发送心跳消息,负载均衡器根据心跳情况判断中介者实例的健康状态,将不健康的实例从负载均衡池中移除,保证系统的稳定性。