当前位置: 首页 > news >正文

基于Quarkus与MCP协议构建Java多智能体LLM Web前端实践

1. 项目概述:一个为LLM设计的Web前端与多智能体通信的Java实践

如果你是一名Java开发者,同时又对当前大语言模型(LLM)的应用开发感兴趣,那么你很可能面临一个尴尬的局面:生态工具链几乎被Python垄断。从OpenAI的官方库到LangChain这样的流行框架,再到各种本地模型的服务端,Python是当之无愧的“一等公民”。这导致了一个问题:当你想要构建一个需要深度定制、高性能、且易于维护的LLM应用前端时,用Java从头造轮子的成本高得吓人,而直接集成Python组件又常常在部署、并发处理和流式响应上遇到各种水土不服。quarkus-chat-ui这个项目,正是为了解决这个痛点而生的。

简单来说,quarkus-chat-ui是一个用Java(具体是Quarkus框架)编写的LLM Web聊天界面。但它远不止一个简单的聊天框。它的核心价值在于两点:第一,它原生支持多智能体(Multi-Agent)之间的自动化对话,每个实例都是一个独立的HTTP MCP服务器,智能体可以像人一样互相调用工具、传递消息;第二,它本身是POJO-actor这个轻量级Actor模型库的一个真实世界用例,展示了如何在复杂的异步、流式场景下,用清晰的并发模型写出稳健的Java代码。这意味着,你不仅得到了一个开箱即用的LLM前端,还获得了一个如何在Java中优雅处理LLM长时、流式请求的绝佳范本。

想象一下这个场景:你启动了两个quarkus-chat-ui实例,一个叫“架构师”,一个叫“开发者”。你可以给“架构师”下达一个指令:“设计一个微服务API”,然后“架构师”可以自主地通过MCP协议调用“开发者”实例的工具,将具体实现任务分配出去,两者在浏览器中实时展开对话和协作,而你作为人类,可以同时旁观甚至介入两者的对话。这不再是简单的“一问一答”,而是构建了一个小型的、可编程的协作网络。对于需要LLM进行复杂任务分解、多角色模拟或自动化工作流的场景,这个工具提供了极为简洁的实现路径。

2. 核心架构与设计哲学拆解

2.1 为什么是MCP(模型上下文协议)?

多智能体通信的核心挑战在于标准化。每个LLM、每个工具都有其独特的API,让它们直接“对话”需要大量的胶水代码。quarkus-chat-ui选择了MCP(Model Context Protocol)作为通信基石,这是一个明智且前沿的选择。

MCP可以理解为LLM世界的“USB协议”。它定义了一套标准,让任何实现了MCP服务器的工具(如数据库、搜索引擎、代码库)都能以一种LLM能理解的方式暴露其功能(即“工具”)。quarkus-chat-ui的每个实例在启动时,都会在/mcp路径下暴露一个HTTP MCP服务器。这个服务器提供了几个关键工具,最主要的是submitPrompt。当一个实例(例如实例A)想要和另一个实例(实例B)对话时,它并不需要知道B的内部实现,只需要知道B的MCP服务器地址,然后调用submitPrompt这个标准工具即可。

这种设计带来了巨大的灵活性:

  1. 解耦:智能体之间仅通过标准的MCP工具调用进行交互,内部LLM后端(Claude、本地模型等)的更换不影响通信逻辑。
  2. 互操作性:理论上,任何兼容MCP的客户端(如Claude Code CLI)或服务器都能接入这个网络,不局限于quarkus-chat-ui自身。
  3. 可观测性:由于通信基于HTTP,你可以使用任何网络调试工具(如curl、Wireshark)来观察和分析智能体间的消息流,这对于调试复杂交互至关重要。

注意:MCP是一个正在快速发展的协议。quarkus-chat-ui的实现聚焦于HTTP传输和核心工具集,这保证了与当前主流MCP生态(如Claude Code)的良好兼容性。在选择此方案时,需关注MCP协议本身的演进。

2.2 Quarkus框架的选择:为流式与原生编译而生

用Java写Web服务不稀奇,但用Java优雅地处理LLM典型的数十秒长时请求Server-Sent Events (SSE) 流式响应,则是对框架的严峻考验。quarkus-chat-ui选择Quarkus,绝非偶然。

传统Spring Boot应用在处理大量并发长连接时,线程模型可能成为瓶颈。每个SSE连接都可能长时间占用一个线程。Quarkus从设计之初就是响应式(Reactive)优先的,它基于Vert.x和Mutiny等库,提供了高效的异步非阻塞I/O处理能力。在quarkus-chat-ui中,你看不到复杂的线程池配置或手动的flush()操作。一个SSE端点简洁到令人惊讶:

@GET @Path("/events/{sessionId}") @Produces(MediaType.SERVER_SENT_EVENTS) @RestStreamElementType(MediaType.APPLICATION_JSON) public Multi<ChatEvent> events(@PathParam("sessionId") String sessionId) { return chatService.getEventStream(sessionId); }

这段代码返回一个Multi<ChatEvent>流。Quarkus和底层的Mutiny库会负责一切:背压(Backpressure)管理、连接保活、客户端重连、以及高效的数据块编码和发送。开发者只需要关心如何生成事件流,而不必陷入网络层的细节。这对于需要稳定、长时间向浏览器推送LLM生成内容的场景来说,是基础且关键的优势。

此外,Quarkus对GraalVM原生编译(Native Image)的一等公民支持,是另一个杀手级特性。它允许你将整个Java应用编译成一个独立的、启动极快的原生可执行文件。这对于需要快速部署、伸缩的LLM辅助工具场景非常有用。项目直接提供了各平台的原生二进制包,用户下载后无需安装JDK即可运行,极大地降低了使用门槛。

2.3 POJO-actor:管理复杂并发的“定海神针”

多智能体、HTTP MCP服务器、SSE流、提示词队列、取消请求……这些功能交织在一起,会引发恐怖的并发问题:竞态条件、死锁、状态不一致。quarkus-chat-ui的解决方案是引入POJO-actor,一个轻量级的Actor模型库。

Actor模型的核心思想是“一切皆Actor”。每个Actor都是一个独立的计算实体,拥有自己的私有状态,并且只通过异步消息(tellask)与其他Actor通信。这种模型天然避免了共享内存和锁,让并发逻辑变得清晰。

quarkus-chat-ui中,不同的关注点被隔离到不同的Actor中:

  • 聊天会话Actor:管理一个对话会话的状态和历史。
  • 队列管理Actor:负责处理用户和MCP传入的提示词排队、执行顺序。
  • 失速检测Actor:监控长时间未响应的请求。

当LLM后端(可能是一个阻塞的HTTP调用)需要执行时,这个阻塞操作被提交给一个虚拟线程(Virtual Thread)执行。虚拟线程是Java 21引入的轻量级线程,可以高效地处理阻塞I/O。当操作完成时,虚拟线程会向对应的Actor发送一条消息告知结果。这样,主业务逻辑(Actor)始终保持非阻塞、响应迅速,而阻塞操作被安全地卸载。

这种设计带来的好处是,整个应用代码中没有出现一个synchronized关键字或显式的锁。并发复杂性被Actor的邮箱和消息处理机制所封装。这对于需要高可靠性的多智能体系统来说,是架构上的重要保障。代码的可读性和可维护性也大大提升,因为每个Actor的职责都非常单一和明确。

3. 功能深度解析与实操要点

3.1 多智能体对话机制详解

多智能体对话是quarkus-chat-ui最吸引人的功能。其工作流程是一个精巧的“上下文注入”与“工具回调”的循环。

假设实例A(运行在http://localhost:28010)想要询问实例B(运行在http://localhost:28020)。用户在A的浏览器中输入指令,要求调用B的submitPrompt工具。A的LLM(如Claude)在收到用户指令后,会识别出这是一个MCP工具调用,并向B的/mcp端点发起HTTP请求。

关键在于B收到请求后的处理。B的MCP服务器不会直接把原始提示词丢给自己的LLM。相反,它会自动对提示词进行富化(Enrich)。它会插入一段系统上下文,明确告诉自己的LLM:“你正在哪个实例上运行”、“这个消息是谁发来的”、以及最重要的——“你应该如何回复”

富化后的提示词模板大致如下:

[Context] You are running on: http://localhost:28020 Received via MCP from: localhost:28010 [Message] What should we work on today? [How to Reply] Use callMcpServer tool: - serverUrl: http://localhost:28010 - toolName: submitPrompt - arguments: {"prompt": "your reply", "_caller": "http://localhost:28020"}

这样,B的LLM在生成回复时,就完全清楚了对话的上下文和回复的路径。它会生成类似“让我们从API层开始设计”的回复内容,并在同一个思考过程中,构造出调用A的submitPrompt工具的指令。于是,回复内容又作为新的提示词传回了A。一个自主的对话循环就此建立。

实操心得:这个“富化”步骤是智能体间有效协作的关键。在实际定制中,你可以修改这个富化模板,例如加入更多角色设定(“你是一个严谨的测试工程师”)、对话历史摘要,或者特定的协作规则,从而引导智能体表现出更专业、更符合预期的行为。

3.2 提示词队列:应对LLM的异步本质

LLM生成响应速度不确定,可能很快,也可能需要几十秒。用户在等待一个回答时,可能又想到了新的问题。一个粗糙的UI会禁用输入框,或者新输入覆盖旧问题,体验很差。quarkus-chat-ui持久化提示词队列优雅地解决了这个问题。

它的行为符合直觉:

  1. 当LLM正忙于处理“解释这段代码”时,用户可以在输入框中继续键入“现在为它编写测试”和“并生成文档”。
  2. 这两个新提示词会被自动加入队列,在UI中清晰展示。
  3. 当“解释这段代码”的响应流结束后,系统会自动从队列中取出“现在为它编写测试”并发送给LLM。
  4. 该请求完成后,继续处理“并生成文档”。

这个队列不仅是内存中的,它通过浏览器本地存储实现了跨页面刷新的持久化。即使你关闭了浏览器标签,下次打开,未执行的队列任务依然存在。更强大的是,队列是可编辑的。你可以拖拽调整任务顺序,或者直接删除某个尚未执行的任务。这对于规划复杂的多步思考过程非常有用。

多智能体场景下,队列的取消逻辑也得到了精心处理。当你点击“取消”时,系统不仅要停止当前实例的LLM生成,还需要通过MCP协议,将取消信号传递到可能正在为当前任务工作的其他智能体实例,并清理由此产生的连锁排队任务。这个功能体现了设计者对真实使用场景的深入思考。

3.3 后端适配器设计:高度的可扩展性

项目没有将后端LLM服务写死,而是通过一个简洁的LlmProvider接口,抽象了不同LLM服务的差异:

public interface LlmProvider { String id(); void sendPrompt(String prompt, String model, Consumer<ChatEvent> emitter, ProviderContext ctx); void cancel(); // ... }

要集成一个新的LLM服务(比如直接调用OpenAI的API,或一个新的本地模型服务),你只需要实现这个接口。sendPrompt方法接收提示词、模型参数和一个事件发射器(Consumer<ChatEvent>)。你的实现里只需要处理与特定后端的通信,并将返回的流(无论是SSE还是普通响应)转换为标准的ChatEvent(如START,CHUNK,COMPLETE)回调给发射器即可。队列管理、会话状态、MCP服务器等所有上层功能都自动可用。

目前官方支持三种Provider:

  • claude: 包装Claude Code CLI,需要ANTHROPIC_API_KEY
  • codex: 包装OpenAI Codex CLI,需要OPENAI_API_KEY
  • openai-compat: 包装任何提供OpenAI兼容API的服务,如本地运行的vLLMOllama。这是连接强大本地模型的桥梁。

这种设计意味着,quarkus-chat-ui作为一个“前端”,其能力边界实际上由你所能连接的后端LLM决定。你可以用免费的本地模型搭建一个私人多智能体系统,也可以使用顶级的商业API。

4. 从零开始:完整搭建与配置实战

4.1 环境准备与本地模型部署

让我们从最实用的场景开始:使用本地模型运行多智能体。这里以Ollama为例,因为它最简单。如果你有GPU,vLLM会获得极快的推理速度。

步骤一:部署本地LLM服务

对于Ollama(CPU/GPU通用):

# 1. 安装Ollama(请参考官网) # 2. 拉取一个适合编程对话的模型,例如Qwen2.5-Coder ollama pull qwen2.5-coder:7b # 3. 运行模型服务。Ollama默认在 http://localhost:11434 提供API ollama run qwen2.5-coder:7b # 注意:`ollama run`会启动聊天,对于API服务,通常模型拉取后Ollama服务已就绪。

对于vLLM(推荐GPU环境):

# 1. 安装vLLM: pip install vllm # 2. 启动服务,指定模型和端口 vllm serve Qwen/Qwen2.5-Coder-7B-Instruct --port 8000 --api-key token-abc123 # 现在vLLM在 http://localhost:8000 提供了OpenAI兼容的API

步骤二:获取并运行quarkus-chat-ui

你有两种方式运行quarkus-chat-ui:直接使用预编译的原生可执行文件(最快),或者从源码构建(适合开发定制)。

方案A:使用原生可执行文件(无需JDK)

  1. 前往项目的GitHub Release页面。
  2. 根据你的系统下载对应的二进制文件(如quarkus-chat-ui-linux-amd64)。
  3. 在终端中赋予执行权限并运行:
    chmod +x quarkus-chat-ui-linux-amd64 ./quarkus-chat-ui-linux-amd64 -Dchat-ui.provider=openai-compat -Dchat-ui.openai-compat.base-url=http://localhost:11434/v1 -Dquarkus.http.port=28010
    如果你的模型服务是vLLM,则将base-url改为http://localhost:8000

方案B:从源码构建(需要JDK 21+和Maven)

git clone https://github.com/scivicslab/quarkus-chat-ui cd quarkus-chat-ui mvn install -DskipTests # 运行 java -Dchat-ui.provider=openai-compat \ -Dchat-ui.openai-compat.base-url=http://localhost:11434/v1 \ -Dquarkus.http.port=28010 \ -jar app/target/quarkus-app/quarkus-run.jar

运行成功后,打开浏览器访问http://localhost:28010,你应该能看到简洁的聊天界面。尝试发送一条消息,确认本地模型正常工作。

注意事项:首次使用本地模型时,回复可能会比较慢,这取决于你的硬件。7B参数量的模型在CPU上可能需要数十秒。确保你的Ollama或vLLM服务日志显示模型已成功加载并正在处理请求。如果遇到连接错误,检查base-url是否正确(Ollama是/v1后缀,vLLM通常不是)。

4.2 配置双智能体对话(以Claude Code为例)

要体验智能体间对话,你需要使用支持MCP客户端的后端。这里以Claude Code CLI为例,因为它内置了MCP管理功能。

前提条件

  1. 拥有Anthropic API Key。
  2. 已从源码构建quarkus-chat-ui(参考4.1方案B)。
  3. 准备三个终端窗口和两个浏览器标签页。

详细步骤

  1. 安装并配置Claude Code CLI

    npm install -g @anthropic-ai/claude-code export ANTHROPIC_API_KEY="你的API密钥" claude --version # 验证安装
  2. 启动智能体A(Alice,端口28010)终端1,在项目根目录执行:

    java -Dchat-ui.provider=claude -Dquarkus.http.port=28010 -jar app/target/quarkus-app/quarkus-run.jar

    浏览器打开http://localhost:28010

  3. 启动智能体B(Bob,端口28020)终端2,同样先设置API密钥,然后启动:

    export ANTHROPIC_API_KEY="你的API密钥" java -Dchat-ui.provider=claude -Dquarkus.http.port=28020 -jar app/target/quarkus-app/quarkus-run.jar

    浏览器打开http://localhost:28020

  4. 配置MCP服务发现(关键步骤)终端3,执行以下命令,告诉Claude Code CLI这两个MCP服务器的位置:

    # 让Alice知道Bob claude mcp add bob --transport http http://localhost:28020/mcp # 让Bob知道Alice claude mcp add alice --transport http http://localhost:28010/mcp # 查看注册列表 claude mcp list

    此时应看到alicebob的条目。

  5. 重启智能体实例:MCP配置在Claude Code CLI启动时加载。因此需要重启终端1终端2中的quarkus-chat-ui进程(Ctrl+C后重新运行启动命令)。

  6. 测试对话在Alice的浏览器(28010)中输入

    Use mcp__bob__submitPrompt to send "Hello Bob! What's your opinion on using microservices?" to Bob. Set _caller to http://localhost:28010.

    点击发送。Claude会识别出mcp__bob__submitPrompt工具并调用它。切换到Bob的浏览器(28020),你会看到消息出现:[MCP from localhost:28010] Hello Bob! ...。Bob的Claude会自动生成回复,并调用工具将回复发回给Alice。回到Alice的浏览器,查看回复是否出现。一个自动的对话循环就此开始。

  7. 清理:测试完成后,移除MCP注册以避免冲突:

    claude mcp remove alice claude mcp remove bob

4.3 核心配置项解析

quarkus-chat-ui通过Java系统属性(-D参数)进行配置,非常灵活。

配置项描述示例值必需
chat-ui.provider指定LLM后端提供商。claude,codex,openai-compat
quarkus.http.port应用服务的HTTP端口。28010,8080否(默认8080)
chat-ui.openai-compat.base-url当provider为openai-compat时,本地模型服务的API地址。http://localhost:11434/v1(Ollama)
http://localhost:8000(vLLM)
是(仅openai-compat)
chat-ui.openai-compat.api-key如果本地服务需要API密钥(如vLLM设置了--api-key)。token-abc123
chat-ui.openai-compat.model指定请求的模型名称,如果与默认值不同。Qwen2.5-Coder-7B-Instruct

组合配置示例

  • 使用Claude API,端口设为28080:-Dchat-ui.provider=claude -Dquarkus.http.port=28080
  • 使用本地Ollama的CodeLlama模型:-Dchat-ui.provider=openai-compat -Dchat-ui.openai-compat.base-url=http://localhost:11434/v1 -Dchat-ui.openai-compat.model=codellama:7b
  • 使用vLLM服务并带API密钥:-Dchat-ui.provider=openai-compat -Dchat-ui.openai-compat.base-url=http://localhost:8000 -Dchat-ui.openai-compat.api-key=your-token-here

5. 常见问题排查与进阶技巧

5.1 启动与连接问题速查表

在搭建过程中,你可能会遇到以下常见问题。这里提供一个快速排查指南。

问题现象可能原因解决方案
启动失败,提示端口占用默认端口8080或其他指定端口已被占用。使用-Dquarkus.http.port=新端口指定另一个端口。用lsof -i :端口号netstat -ano | findstr :端口号(Windows) 查看占用进程。
浏览器访问localhost:28010无响应1. 应用未成功启动。
2. 防火墙阻止了端口访问。
1. 检查终端日志是否有错误。确保使用正确的JAR包路径和配置。
2. 检查本地防火墙设置,暂时禁用或添加规则。
发送消息后长时间无反应(使用openai-compat1. 本地模型服务未运行或地址错误。
2. 模型加载失败或首次推理极慢。
3. API密钥或模型名称错误。
1. 确认Ollama/vLLM服务已启动且base-url正确(Ollama注意/v1后缀)。
2. 查看模型服务日志,确认是否有请求进来和错误信息。CPU运行大模型请耐心等待。
3. 检查vLLM是否设置了--api-key,并在配置中提供。
使用Claude时提示ANTHROPIC_API_KEY not found环境变量未正确设置。在每个启动quarkus-chat-ui的终端中,都执行export ANTHROPIC_API_KEY=你的key。对于Windows PowerShell,使用$env:ANTHROPIC_API_KEY="你的key"
MCP工具调用失败,提示mcp__xxx__submitPrompt not found1. MCP服务未在Claude Code CLI中注册。
2. 注册后未重启quarkus-chat-ui实例。
3. 目标实例未运行。
1. 用claude mcp add正确注册对方地址。
2.重要:注册后,必须重启对应的quarkus-chat-ui实例,Claude Code CLI才会加载新配置。
3. 用curl http://localhost:28020/mcp测试目标MCP端点是否可达。
智能体B收到消息但不回复1. B实例的MCP配置中缺少A的地址。
2. B的LLM在生成回复时,未能正确构造调用A的工具指令。
1. 确保在B端也用claude mcp add alice ...注册了A。
2. 检查B的浏览器开发者工具网络面板,看B的LLM是否向A的/mcp端点发出了submitPrompt请求。可能是提示词富化模板或LLM理解问题。
原生可执行文件在运行时崩溃或报错1. 平台不兼容(如ARM芯片运行x86二进制)。
2. 缺少必要的原生依赖(某些Linux发行版)。
1. 下载对应你系统架构的二进制文件(如Apple Silicon用macos-arm64)。
2. 尝试从源码构建JAR包运行,这兼容性最好。对于Linux,确保有glibc等基础库。

5.2 性能调优与监控建议

当系统稳定运行后,你可能需要关注性能和资源使用情况。

  1. 虚拟线程监控:项目利用Java虚拟线程处理阻塞IO。你可以通过JVM参数开启监控:

    java -Dquarkus.thread-pool.virtual-threads.enabled=true \ -Dquarkus.thread-pool.virtual-threads.logging.enabled=true \ ...其他配置...

    在日志中观察虚拟线程的创建和销毁情况,确保没有线程泄漏(长时间不释放)。

  2. HTTP连接池:智能体间频繁的MCP调用会创建大量HTTP连接。考虑调整Quarkus的HTTP客户端配置(如果你直接修改了代码进行调用):

    # 在application.properties中 quarkus.rest-client.max-pool-size=100 # 连接池大小 quarkus.rest-client.keep-alive-enabled=true # 保持连接

    对于quarkus-chat-ui内置的MCP客户端,需要查看其是否使用了可配置的客户端。

  3. 流式响应缓冲区:SSE流式传输默认有缓冲区。如果发现前端接收消息有延迟,可以检查Quarkus的响应式流配置,但通常默认值已足够。在极高并发下,可考虑调整Multi的发布策略。

  4. 本地模型推理优化

    • vLLM:使用--tensor-parallel-size--pipeline-parallel-size利用多GPU。调整--max-num-seqs提高吞吐量。
    • Ollama:在Modelfile中指定num_gpu层数以启用GPU加速。对于CPU,调整num_thread参数。
    • 通用:在quarkus-chat-ui的请求中,合理设置max_tokens等参数,避免生成过长内容拖慢整体流程。

5.3 自定义与扩展指南

quarkus-chat-ui作为一个开源项目,提供了良好的扩展点。

  1. 实现新的LlmProvider:这是集成新后端的主要方式。

    • 创建一个类实现LlmProvider接口。
    • sendPrompt方法中,使用你喜欢的HTTP客户端(如Quarkus的RestClient)调用后端API。
    • 将后端返回的流(无论是SSE还是JSON)解析并转换为ChatEvent对象,通过Consumer<ChatEvent> emitter回调发出。ChatEvent类型包括STARTCHUNKCOMPLETEERROR等。
    • cancel方法中实现中断请求的逻辑。
    • 最后,通过CDI(@ApplicationScoped)将你的Provider注册为Bean,Quarkus会自动发现它。
  2. 修改提示词富化模板:智能体间对话的“上下文”和“回复指南”由McpServerService类中的逻辑控制。你可以找到构建提示词字符串的代码部分,修改其中的模板文本,来改变智能体的自我认知、行为规则或回复格式。例如,你可以让智能体在回复时遵循特定的JSON格式。

  3. 集成quarkus-mcp-gateway进行扩展:当智能体数量超过两个时,两两之间配置MCP会变得繁琐。此时可以引入quarkus-mcp-gateway作为中心化的路由和发现服务。所有智能体向网关注册,网关负责按名称路由请求。这更接近生产环境的微服务架构。你需要部署一个网关实例,并将所有quarkus-chat-ui实例的chat-ui.mcp.gateway-url指向它。

  4. UI定制:前端资源位于src/main/resources/META-INF/resources目录下。你可以修改HTML、CSS和JavaScript来改变界面布局、颜色主题或添加新的交互功能。由于这是一个Quarkus项目,前端修改后重新打包即可生效。

5.4 生产环境部署考量

如果你计划将quarkus-chat-ui用于更严肃的场景,需要考虑以下几点:

  1. 安全性

    • API密钥管理:切勿将API密钥硬编码在命令行或代码中。使用环境变量、Kubernetes Secrets或HashiCorp Vault等秘密管理工具。
    • 网络隔离:确保MCP服务器端点(/mcp)不直接暴露在公网。应在内部网络或通过API网关(带有认证)进行访问。
    • 输入验证:虽然MCP调用在智能体间进行,但仍需警惕提示词注入攻击。对传入的提示词进行基本的清理和长度限制是明智的。
  2. 可观测性

    • 启用Quarkus的Micrometer指标,并集成到Prometheus和Grafana中,监控请求延迟、错误率、活跃连接数等。
    • 配置结构化日志(JSON格式),便于通过ELK或Loki进行日志聚合和分析。
    • 为重要的MCP工具调用添加分布式追踪(通过OpenTelemetry),以可视化智能体间的调用链。
  3. 高可用与伸缩

    • 无状态设计:quarkus-chat-ui实例本身是无状态的(会话状态可通过外部存储如Redis实现持久化)。这便于水平扩展。
    • 使用原生镜像:编译为原生可执行文件,启动速度极快(毫秒级),更适合容器化部署和快速伸缩。
    • 负载均衡:在多个实例前部署负载均衡器(如Nginx),并确保SSE长连接在会话期间粘滞到同一后端。
  4. 资源限制

    • 设置JVM内存限制(如果使用JAR运行)或容器资源限制。
    • 为每个quarkus-chat-ui实例配置合理的并发请求上限,避免本地模型后端被压垮。这可以通过Actor的邮箱容量或HTTP限流中间件来实现。

通过以上这些实践,quarkus-chat-ui从一个演示项目,可以逐步演进为一个支撑内部团队协作、自动化流程或复杂AI应用的核心组件。它的价值不仅在于功能,更在于其采用Quarkus和POJO-actor所展示的、在现代Java中构建复杂异步应用的清晰架构模式。

http://www.jsqmd.com/news/895379/

相关文章:

  • 8天构建AI自动生成PR描述工具:从零到一的技术实战复盘
  • LeetCode 438:找到字符串中所有字母异位词 | 滑动窗口
  • Numeca在Linux下的两种安装路径选择:/usr/ 还是 /home/?权限管理与后续使用对比
  • 从37欧元账单到3.5欧元:Serverless架构重构实战与云成本优化指南
  • Hitboxer SOCD Cleaner:解决游戏键盘输入冲突的终极方案
  • 苏州可靠的宠物店怎么选 关键因素解析 - 品牌排行榜
  • Canopy:从模糊指令到精准AI技能,构建可复用AI能力平台
  • 2026年5月液压升降平台厂家推荐:TOP5排名专业评测工业厂房重载升降性价比高 - 品牌推荐
  • 不确定系统中的多目标规划模型与应用【附代码】
  • Page Assist终极指南:在浏览器中安全使用本地AI的完整教程
  • 深度解析:3步实现Wallpaper Engine资源逆向工程与高效提取
  • Seraphine:英雄联盟玩家的3大智能辅助完整指南,告别信息焦虑
  • C4002 毫米波人体存在传感器:基于 PC 串口的测试方法与结果分析
  • 2026年4月国内比较好的AI无损测糖选果机品牌推荐,小柿子选果机/冬枣选果机,AI无损测糖选果机制造商哪家权威 - 品牌推荐师
  • EFM32开发板SWD通信故障排查与优化
  • Kali 2024.1 新装后,USB网卡(RT5370芯片)驱动安装保姆级避坑指南
  • HsMod:炉石传说游戏体验全方位优化插件终极指南
  • Unity 2018+ 版本里,那个消失的Standard Assets去哪了?手把手教你从Asset Store找回并修复BUG
  • Python循环不会写?for和while实战技巧大公开
  • ThinkPad开机滴滴响或显示Fan error/2100硬盘错误?保姆级拆机清灰与硬件检测指南(避免误判主板问题)
  • 告别命令行!用VSCode+PyQt5+QtDesigner,10分钟搞定你的第一个Python桌面应用
  • 突破《原神》60帧限制:安全高效的帧率解锁方案
  • Unity 2018+ 版本如何从Asset Store找回并导入Standard Assets(附旧脚本修复指南)
  • Kali Linux网卡驱动安装避坑大全:从RT5370到linux-headers,新手常踩的5个雷我都帮你排了
  • 2026市面上耐用的给水pph管厂家推荐榜单 - 品牌排行榜
  • LeetCode 10:正则表达式匹配 | 动态规划
  • EhViewer开源漫画浏览器:5个技巧打造你的专属漫画阅读体验
  • 别再只盯着BIOS了!聊聊ACPI这个‘隐形管家’如何管好你电脑的睡眠与唤醒
  • 我学了四门编程语言,最后靠一门“最无聊”的语言拿到了5个offer
  • 2025-2026年上海1500万-2000万新房项目推荐:五大楼盘评测夜间通勤防疲惫避免学区不确定注意事项 - 品牌推荐