【 AI智能体时代:一名Javaer的技术随想录】RPC的异步和MCP的异步,有何区别?

0 阅读5分钟

RPC异步调用和MCP的异步并行,解决的是不同层次的问题。

来做个类比:

核心区别:异步的"维度"不同

传统RPC异步:微观层面的"非阻塞"

// 单个RPC调用的异步 - 解决"不等待"
CompletableFuture<User> userFuture = userService.getUserAsync(id);
userFuture.thenAccept(user -> {
    // 回调处理
});

这是单个服务调用的非阻塞,避免线程在等待响应时被占用。

MCP异步:宏观层面的"并行编排"

// MCP的异步 - 解决"不知道调用什么"+"一起调用"
List<CompletableFuture<?>> allFutures = new ArrayList<>();

// 动态发现并并行执行所有相关工具
for (Tool tool : mcpClient.discoverRelevantTools(userQuery)) {
    allFutures.add(mcpClient.executeAsync(tool, params));
}

// 统一等待所有结果
CompletableFuture.allOf(allFutures.toArray(new CompletableFuture[0]))
    .thenAccept(v -> {
        // 所有工具的结果都回来了
    });

这是多个不同工具的动态发现+并行执行

用现实场景对比

假设要开发一个智能旅行助手:

传统RPC异步方式

// 你必须预先知道要调用哪些服务
CompletableFuture<Weather> weatherFuture = weatherService.getWeatherAsync(city);
CompletableFuture<Flight> flightFuture = flightService.searchFlightsAsync(departure, arrival);
CompletableFuture<Hotel> hotelFuture = hotelService.findHotelsAsync(city, dates);

// 等待所有结果
CompletableFuture.allOf(weatherFuture, flightFuture, hotelFuture)
    .thenAccept(v -> {
        // 组合结果
    });

问题

  1. 必须硬编码知道调用哪些服务
  2. 每增加一个新服务(如"景点推荐"、"汇率查询"),就要修改代码
  3. 不同服务的API风格可能不同

MCP方式

// 用户输入:"我想去北京旅行,帮我规划一下"
String userQuery = "我想去北京旅行,帮我规划一下";

// 1. 自动分析需求,发现相关工具
List<Tool> relevantTools = mcpClient.analyzeAndDiscoverTools(userQuery);
// 可能返回:["weather_query", "flight_search", "hotel_finder", "attraction_recommend", "currency_converter"]

// 2. 并行执行所有相关工具
List<CompletableFuture<ToolResult>> futures = relevantTools.stream()
    .map(tool -> mcpClient.executeAsync(tool, buildParams(userQuery)))
    .collect(Collectors.toList());

// 3. 统一处理结果
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
    .thenAccept(v -> {
        List<ToolResult> results = futures.stream()
            .map(CompletableFuture::join)
            .collect(Collectors.toList());
        // 智能整合所有结果
    });

关键差异总结

对比维度传统RPC异步MCP异步并行对Java开发者的意义
知道调用什么开发者必须预先知道AI动态分析需求,自动发现无需为每个功能写死调用链
服务注册需修改代码、重新部署运行时动态注册,热插拔新工具上线不影响现有代码
接口统一性每个服务接口不同统一工具调用规范一套代码调用所有工具
扩展成本高(修改代码→测试→部署)低(注册工具→立即可用)快速响应业务变化
典型场景已知流程的业务系统探索性、创造性的AI应用智能助手、数据分析平台

实际开发中的类比

传统RPC:点菜餐厅

// 你必须知道菜单上有什么
public Order orderMeal() {
    Dish soup = restaurant.orderSoup();      // 等汤上来
    Dish main = restaurant.orderMainCourse(); // 再等主菜
    Dish dessert = restaurant.orderDessert(); // 最后等甜点
    return new Order(soup, main, dessert);
}
// 总时间 = 汤(5分钟) + 主菜(10分钟) + 甜点(3分钟) = 18分钟

MCP:自助餐+智能推荐

public BuffetPlan planBuffet(String preference) {
    // 1. 智能分析你的口味偏好
    List<FoodStation> stations = buffetAnalyzer.analyzePreference(preference);
    // 可能推荐:沙拉区、热菜区、甜品区、饮料区
    
    // 2. 并行从所有推荐区取餐
    List<CompletableFuture<Dish>> futures = stations.stream()
        .map(station -> station.serveAsync())
        .collect(Collectors.toList());
    
    // 3. 同时拿到所有食物
    return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
        .thenApply(v -> new BuffetPlan(futures.stream()
            .map(CompletableFuture::join)
            .collect(Collectors.toList())));
}
// 总时间 ≈ 最慢的取餐区时间 ≈ 5分钟

技术架构演进

传统微服务架构(RPC异步)

用户请求 → API网关 → 服务A(异步) → 服务B(异步) → 服务C(异步)
                   ↓            ↓            ↓
                 回调处理     回调处理     回调处理

特点:每个服务独立异步,但调用链是固定的。

MCP智能体架构

用户请求 → AI大脑
            ├─ 分析需求
            ├─ 发现工具:[天气, 航班, 酒店, 景点...]
            ├─ 并行执行所有工具
            └─ 智能整合结果

特点:动态工作流,工具可插拔,结果智能整合。

回答核心疑问

"RPC调用也可以用异步啊?" ​ → 是的,但这是不同层面的异步

  1. RPC异步是"如何调用"的优化

    • 技术手段:CompletableFuture@Async、响应式编程
    • 解决的问题:不阻塞线程
  2. MCP异步是"调用什么+如何编排"的优化

    • 技术手段:工具发现+并行执行+结果整合
    • 解决的问题:不知道调用什么 + 如何并行调用多个不同服务

实际代码对比

传统方式:新增功能就要改代码

// 初始版本
public TravelInfo getTravelInfo(String city) {
    Weather weather = weatherService.getWeather(city);
    List<Hotel> hotels = hotelService.findHotels(city);
    return new TravelInfo(weather, hotels);
}

// 业务说要加"航班信息" → 必须修改代码
public TravelInfo getTravelInfo(String city) {
    Weather weather = weatherService.getWeather(city);
    List<Hotel> hotels = hotelService.findHotels(city);
    List<Flight> flights = flightService.searchFlights(city); // 新增
    return new TravelInfo(weather, hotels, flights); // 修改返回结构
}
// 还要重新测试、部署...

MCP方式:新增功能只需注册工具

// 初始版本
public TravelInfo getTravelInfo(String query) {
    List<Tool> tools = mcpClient.discoverToolsForQuery(query);
    // 动态执行所有相关工具...
}

// 业务说要加"航班信息" → 只需注册新工具
// 1. 航班服务提供者注册工具
mcpServer.registerTool(new FlightSearchTool());
// 2. 完成!AI会自动发现并使用
// 代码无需修改,无需重新部署

总结

RPC确实可以用异步调用,但这就像是在优化单条车道的通行效率。而MCP的异步并行是在建设一个智能交通枢纽

  • RPC异步:让每辆车跑得更快(不阻塞)
  • MCP异步:动态规划多条路线,让所有车同时出发,智能选择目的地

建议

  • 系统流程固定、服务明确​ → 用RPC异步,简单高效
  • 系统需要动态组合多种能力、快速扩展​ → 考虑MCP,灵活智能
  • 很多系统是混合架构:核心交易用RPC保证一致性,增值服务用MCP提高灵活性

希望这个解释能帮你理解两者差异!这正是现代Java开发中"传统微服务"和"AI原生架构"的有趣区别。