<!DOCTYPE html>
|
<html lang="zh-CN">
|
<head>
|
<meta charset="UTF-8">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<title>Broker IPC 方案对比:Named Pipes vs COM Interop</title>
|
<style>
|
:root {
|
--primary: #2563eb;
|
--primary-light: #dbeafe;
|
--success: #16a34a;
|
--success-light: #dcfce7;
|
--warning: #d97706;
|
--warning-light: #fef3c7;
|
--danger: #dc2626;
|
--danger-light: #fee2e2;
|
--gray-50: #f9fafb;
|
--gray-100: #f3f4f6;
|
--gray-200: #e5e7eb;
|
--gray-600: #4b5563;
|
--gray-800: #1f2937;
|
--gray-900: #111827;
|
}
|
|
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
body {
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Noto Sans SC", sans-serif;
|
line-height: 1.7;
|
color: var(--gray-800);
|
background: linear-gradient(135deg, #f0f4ff 0%, #fafbff 100%);
|
padding: 2rem 1rem;
|
}
|
|
.container {
|
max-width: 960px;
|
margin: 0 auto;
|
}
|
|
header {
|
text-align: center;
|
margin-bottom: 2.5rem;
|
}
|
|
header h1 {
|
font-size: 1.8rem;
|
color: var(--gray-900);
|
margin-bottom: 0.5rem;
|
}
|
|
header .subtitle {
|
color: var(--gray-600);
|
font-size: 0.95rem;
|
}
|
|
.badge {
|
display: inline-block;
|
padding: 0.15rem 0.6rem;
|
border-radius: 999px;
|
font-size: 0.75rem;
|
font-weight: 600;
|
margin-left: 0.4rem;
|
vertical-align: middle;
|
}
|
.badge-rec { background: var(--success-light); color: var(--success); }
|
.badge-alt { background: var(--warning-light); color: var(--warning); }
|
|
/* ---- Comparison Table ---- */
|
.table-wrap {
|
overflow-x: auto;
|
margin-bottom: 2rem;
|
border-radius: 12px;
|
box-shadow: 0 1px 3px rgba(0,0,0,.08);
|
}
|
|
table {
|
width: 100%;
|
border-collapse: collapse;
|
background: #fff;
|
font-size: 0.92rem;
|
}
|
|
thead th {
|
background: var(--primary);
|
color: #fff;
|
padding: 0.85rem 1rem;
|
text-align: left;
|
font-weight: 600;
|
white-space: nowrap;
|
}
|
thead th:first-child { border-radius: 12px 0 0 0; }
|
thead th:last-child { border-radius: 0 12px 0 0; }
|
|
tbody td {
|
padding: 0.75rem 1rem;
|
border-bottom: 1px solid var(--gray-200);
|
vertical-align: top;
|
}
|
|
tbody tr:last-child td { border-bottom: none; }
|
tbody tr:nth-child(even) { background: var(--gray-50); }
|
|
td:first-child {
|
font-weight: 600;
|
color: var(--gray-900);
|
white-space: nowrap;
|
}
|
|
.cell-good { color: var(--success); font-weight: 500; }
|
.cell-bad { color: var(--danger); font-weight: 500; }
|
.cell-neutral { color: var(--warning); font-weight: 500; }
|
|
/* ---- Sections ---- */
|
.section {
|
background: #fff;
|
border-radius: 12px;
|
padding: 1.8rem 2rem;
|
margin-bottom: 1.5rem;
|
box-shadow: 0 1px 3px rgba(0,0,0,.08);
|
}
|
|
.section h2 {
|
font-size: 1.2rem;
|
color: var(--primary);
|
margin-bottom: 1rem;
|
padding-bottom: 0.5rem;
|
border-bottom: 2px solid var(--primary-light);
|
}
|
|
.section h3 {
|
font-size: 1rem;
|
color: var(--gray-900);
|
margin: 1.2rem 0 0.6rem;
|
}
|
|
/* ---- Factor Cards ---- */
|
.factor-grid {
|
display: grid;
|
grid-template-columns: 1fr 1fr;
|
gap: 1rem;
|
margin-top: 1rem;
|
}
|
@media (max-width: 640px) { .factor-grid { grid-template-columns: 1fr; } }
|
|
.factor-card {
|
border: 1px solid var(--gray-200);
|
border-radius: 8px;
|
padding: 1rem 1.2rem;
|
}
|
.factor-card h4 {
|
font-size: 0.88rem;
|
margin-bottom: 0.4rem;
|
color: var(--gray-900);
|
}
|
.factor-card p {
|
font-size: 0.85rem;
|
color: var(--gray-600);
|
line-height: 1.6;
|
}
|
.factor-card.pro { border-left: 4px solid var(--success); }
|
.factor-card.con { border-left: 4px solid var(--danger); }
|
|
/* ---- Recommendation ---- */
|
.recommendation {
|
background: var(--success-light);
|
border: 1px solid #86efac;
|
border-radius: 10px;
|
padding: 1.5rem 2rem;
|
margin-top: 1.5rem;
|
}
|
.recommendation h2 {
|
color: var(--success);
|
border-bottom-color: #86efac;
|
}
|
.recommendation ul {
|
margin: 0.8rem 0 0 1.2rem;
|
}
|
.recommendation li {
|
margin-bottom: 0.4rem;
|
font-size: 0.92rem;
|
}
|
|
/* ---- Code Hint ---- */
|
code {
|
background: var(--gray-100);
|
padding: 0.15rem 0.4rem;
|
border-radius: 4px;
|
font-size: 0.88em;
|
font-family: "Cascadia Code", "Fira Code", Consolas, monospace;
|
}
|
|
footer {
|
text-align: center;
|
margin-top: 2rem;
|
color: var(--gray-600);
|
font-size: 0.8rem;
|
}
|
</style>
|
</head>
|
<body>
|
<div class="container">
|
|
<header>
|
<h1>Broker IPC 方案对比</h1>
|
<p class="subtitle">Named Pipes vs COM Interop | TapProject V3.0 MVP 架构评估</p>
|
</header>
|
|
<!-- ===================== Comparison Table ===================== -->
|
<div class="table-wrap">
|
<table>
|
<thead>
|
<tr>
|
<th>评估维度</th>
|
<th>Named Pipes <span class="badge badge-rec">推荐</span></th>
|
<th>COM Interop <span class="badge badge-alt">备选</span></th>
|
</tr>
|
</thead>
|
<tbody>
|
<tr>
|
<td>部署复杂度</td>
|
<td class="cell-good">低 — 只需管道名约定,无需注册组件</td>
|
<td class="cell-bad">高 — 需 RegAsm / regsvr32 注册 COM 组件,配置 DCOM 权限</td>
|
</tr>
|
<tr>
|
<td>强类型体验</td>
|
<td class="cell-neutral">弱 — 需手动序列化/反序列化(JSON / Protobuf)</td>
|
<td class="cell-good">强 — .NET 自动生成 RCW,接口调用如同本地对象</td>
|
</tr>
|
<tr>
|
<td>跨机器扩展</td>
|
<td class="cell-good">天然支持 — 可平滑切换到 TCP / gRPC</td>
|
<td class="cell-bad">需 DCOM,防火墙与网络配置复杂</td>
|
</tr>
|
<tr>
|
<td>权限要求</td>
|
<td class="cell-good">低 — 同机管道访问即可,无需特殊权限</td>
|
<td class="cell-bad">需 DCOM 权限配置,企业安全策略常受限</td>
|
</tr>
|
<tr>
|
<td>未来 .NET 兼容性</td>
|
<td class="cell-good">完全兼容 .NET 6 / 7 / 8+</td>
|
<td class="cell-bad">Microsoft 已逐步弱化 COM 投入,.NET Core 支持有限</td>
|
</tr>
|
<tr>
|
<td>性能</td>
|
<td class="cell-neutral">JSON 有序列化开销,但管道本身高效;可换 Protobuf 优化</td>
|
<td class="cell-good">二进制 marshaling 开销小,但有额外 proxy/stub 层</td>
|
</tr>
|
<tr>
|
<td>调试 / 运维</td>
|
<td class="cell-good">管道状态易排查,日志直观</td>
|
<td class="cell-bad">COM 注册问题、权限问题是常见故障源</td>
|
</tr>
|
<tr>
|
<td>与现有代码集成</td>
|
<td class="cell-neutral">需编写连接管理、帧解析逻辑</td>
|
<td class="cell-good">接口定义后客户端代码简洁,类似本地调用</td>
|
</tr>
|
</tbody>
|
</table>
|
</div>
|
|
<!-- ===================== Key Factors ===================== -->
|
<div class="section">
|
<h2>关键考量因素</h2>
|
|
<h3>COM Interop 适合的场景</h3>
|
<div class="factor-grid">
|
<div class="factor-card pro">
|
<h4>✅ 同机通信 + 强类型需求</h4>
|
<p>Broker 与客户端永远在同一台机器,团队熟悉 COM 部署,希望获得透明代理般的调用体验。</p>
|
</div>
|
<div class="factor-card pro">
|
<h4>✅ 已有 COM 组件资产</h4>
|
<p>项目中已有成熟的 COM 接口定义或第三方 COM 组件,可直接复用。</p>
|
</div>
|
</div>
|
|
<h3>Named Pipes 更适合的理由</h3>
|
<div class="factor-grid">
|
<div class="factor-card con">
|
<h4>🚀 部署简单</h4>
|
<p>无需注册 COM 组件,管道名约定即可通信,运维成本极低。</p>
|
</div>
|
<div class="factor-card con">
|
<h4>🔗 跨机器扩展</h4>
|
<p>未来若 Broker 需部署到远程机器,Named Pipes 可平滑切换到 TCP/gRPC,COM Interop 则需大幅改造。</p>
|
</div>
|
<div class="factor-card con">
|
<h4>🛡️ 企业环境友好</h4>
|
<p>DCOM 权限在企业安全策略下经常受限,Named Pipes 无此问题。</p>
|
</div>
|
<div class="factor-card con">
|
<h4>📦 现代 .NET 兼容</h4>
|
<p>项目虽当前为 .NET Framework 4.7.2,但 COM Interop 在 .NET 5+ 上支持逐步弱化,Named Pipes 无此顾虑。</p>
|
</div>
|
</div>
|
</div>
|
|
<!-- ===================== Recommendation ===================== -->
|
<div class="recommendation">
|
<h2>结论与建议</h2>
|
<p><strong>保持 Named Pipes 方案。</strong></p>
|
<p>对于 Broker 跨进程通信场景,Named Pipes 在<strong>部署简易性</strong>、<strong>未来扩展性</strong>和<strong>平台兼容性</strong>上均优于 COM Interop。</p>
|
<ul>
|
<li>如果担心 JSON 序列化开销,可考虑用 <code>MemoryPack</code> 或 <code>Protobuf-net</code> 替代,同时保留 Named Pipes 的架构优势。</li>
|
<li>当前 MVP 帧协议设计(4 字节长度前缀 + UTF8 JSON)已足够清晰,后续优化空间大。</li>
|
<li>COM Interop 仅在"团队已有成熟 COM 资产 + 确定永不跨机器"的前提下才值得考虑。</li>
|
</ul>
|
</div>
|
|
<!-- ===================== Architecture Context ===================== -->
|
<div class="section">
|
<h2>当前 MVP 架构中的 IPC 定位</h2>
|
<p>在已完成的 MVP 实施中,跨进程通信分为两层:</p>
|
<table style="margin-top: 1rem;">
|
<thead>
|
<tr>
|
<th style="width:30%">层级</th>
|
<th>机制</th>
|
<th>状态</th>
|
</tr>
|
</thead>
|
<tbody>
|
<tr>
|
<td>仲裁层(arb.db)</td>
|
<td>SQLite WAL 模式 + BEGIN IMMEDIATE 事务 — 进程间仲裁完全依赖数据库事务,无需 IPC</td>
|
<td class="cell-good">✅ 已实现</td>
|
</tr>
|
<tr>
|
<td>Broker 命令通道</td>
|
<td>Named Pipes 帧协议(4B 长度 + JSON)— 用于客户端向 DeviceBroker.exe 下发设备操作</td>
|
<td class="cell-neutral">⏳ 计划中(P2+)</td>
|
</tr>
|
</tbody>
|
</table>
|
<p style="margin-top: 1rem; color: var(--gray-600); font-size: 0.88rem;">
|
注:当前 MVP 仅实现了 Local 模式(进程内直驱)和 DbLeaseStore(SQLite 仲裁)。Broker 模式的命令通道属于后续迭代范围,此时选择 Named Pipes 作为 IPC 方案仍有充分调整空间。
|
</p>
|
</div>
|
|
<footer>
|
TapProject V3.0 MVP — Broker IPC 方案评估 | 生成于 2026-11-03
|
</footer>
|
|
</div>
|
</body>
|
</html>
|