所有分支的提交所有分支的提交都要跑test都要跑test
|
# NewLife.RocketMQ - エンタープライズ向け純マネージド RocketMQ クライアント





[](https://github.com/NewLifeX/NewLife.RocketMQ/actions/workflows/test.yml)
[](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/Doc/多语言本地化.md)


[](https://github.com/NewLifeX/NewLife.RocketMQ/graphs/contributors)
<!-- lang:start -->
🌐 [English](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.md) | [简体中文](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.zh-CN.md) | [繁體中文](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.zh-TW.md) | [Español](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.es.md) | [Deutsch](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.de.md) | [Français](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.fr.md) | [Português](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.pt.md) | [Русский](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.ru.md) | [한국어](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.ko.md) | [العربية](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.ar.md)
<!-- lang:end -->
> この翻訳は[英語版](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/README.md)より遅れている場合があります。
**エンタープライズ向けの純マネージド RocketMQ クライアント**で、`.NET Framework 4.5+` / `.NET Standard 2.0+` / `.NET Core` / `.NET 5+` をサポートします。
**C# のみで実装され、外部依存はゼロです(Java、gRPC、Protobuf のサードパーティ製ライブラリは不要)。**
---
## 製品概要
NewLife.RocketMQ は、NewLife チームが .NET エコシステム向けに開発した**エンタープライズ向けの純マネージド RocketMQ クライアント**です。RocketMQ の **Remoting プロトコル(4.x/5.x Broker)** と **gRPC Proxy プロトコル(5.x Proxy)** の両方に対応し、Producer と Consumer の主要機能およびエンタープライズ機能を網羅するとともに、Alibaba Cloud、Huawei Cloud、Tencent Cloud、Apache ACL 認証システム向けの統一アダプターを提供します。
**主な特長**:
| 特長 | 説明 |
|---------|-------------|
| **デュアルプロトコル対応** | Remoting(4.x で成熟・安定)+ gRPC(5.x の将来方向)。自動ルーティング。 |
| **外部依存ゼロ** | Protobuf フィールドコーデックを内蔵(NewLife.Core の SpanWriter/SpanReader 上に手書き実装)。Java や gRPC ランタイムは不要。 |
| **マルチクラウド対応** | 統一インターフェース `ICloudProvider` と、Alibaba Cloud、Huawei Cloud、Tencent Cloud、Apache ACL のアダプターを内蔵。 |
| **本番運用対応** | コンシュームリトライ、デッドレターキュー、トランザクションコールバック確認、順序消費、Pop 消費などのエンタープライズ機能を完備。 |
| **イベントバス** | Core の `IEventBus` 契約に基づくイベントバスを内蔵:Producer/Consumer を介してプロセス間でイベントを発行・購読し、失敗時は自動でリトライ/デッドレター処理 |
| **幅広いフレームワーク対応** | .NET Framework 4.5+ から .NET 10 まで。gRPC 機能は .NET Standard 2.1+ で利用可能。 |
| **AOT フレンドリー** | net10.0 ターゲットは NativeAOT/トリミングに対応:フレームのエンコード/デコード、JSON シリアル化、メッセージ圧縮は実行時リフレクションに依存しません。リポジトリには AOT スモークテストと NuGet パッケージ消費側の AOT スモークテストを含み、CI は主要 RID マトリクス(win/linux/osx、musl、Loongson LA64)で AOT 公開と実行を検証します |
| **実行時ローカライズ** | ログ、プロトコル解析例外、公開 API 例外、構成の説明は英語を原文とし、31 言語の単語リストを内蔵。`Localization.Culture` に従って自動翻訳し、英語にフォールバックします。接頭辞付きログは接頭辞を組み立てる前に翻訳され、接頭辞は単語リストの検索対象になりません |
| **高性能** | NewLife.Net の高性能ネットワーク層を基盤に、接続再利用、VIP チャネル、メッセージ圧縮、並行制御を実現。 |
---
## インストール
```powershell
# NuGet パッケージマネージャー
Install-Package NewLife.RocketMQ
# .NET CLI
dotnet add package NewLife.RocketMQ
```
```xml
<!-- PackageReference -->
<PackageReference Include="NewLife.RocketMQ" Version="4.0.*" />
```
---
## クイックスタート
### メッセージの送信
```csharp
using NewLife.RocketMQ;
var producer = new Producer
{
Topic = "test_topic",
NameServerAddress = "127.0.0.1:9876",
Group = "producer_group"
};
producer.Start();
// 同期送信
var result = producer.Publish("Hello RocketMQ!");
Console.WriteLine($"Message ID: {result.MsgId}");
// 非同期送信
await producer.PublishAsync("async message");
// バッチ送信
await producer.PublishBatch(new[] { "message1", "message2", "message3" });
```
### メッセージの消費
```csharp
var consumer = new Consumer
{
Topic = "test_topic",
Group = "consumer_group",
NameServerAddress = "127.0.0.1:9876"
};
consumer.OnConsume = (q, messages) =>
{
foreach (var msg in messages)
{
Console.WriteLine($"Received message: {msg.BodyString}");
}
return true; // true を返すと消費成功を意味します
};
consumer.Start();
```
### gRPC(5.x Proxy)アクセス
```csharp
// Producer:GrpcProxyAddress を設定すると 5.x gRPC 経路で通信します(netstandard2.1+ が必要)
var producer = new Producer
{
Topic = "test_topic",
Group = "producer_group",
NameServerAddress = "127.0.0.1:9876",
GrpcProxyAddress = "http://127.0.0.1:8081",
};
producer.Start();
await producer.PublishAsync("gRPC message");
// Consumer:起動時に購読関係を自動報告(Telemetry 長接続)。受信と ACK は gRPC で行います
var consumer = new Consumer
{
Topic = "test_topic",
Group = "consumer_group",
NameServerAddress = "127.0.0.1:9876",
GrpcProxyAddress = "http://127.0.0.1:8081",
};
consumer.Start();
var route = await consumer.QueryRouteViaGrpcAsync();
var messages = await consumer.ReceiveMessageViaGrpcAsync(route.MessageQueues[0], batchSize: 8);
// ... 業務処理 ...
await consumer.AckMessageViaGrpcAsync("test_topic",
[
.. messages.Select(m => new AckMessageEntry
{
ReceiptHandle = m.SystemProperties?.ReceiptHandle,
MessageId = m.SystemProperties?.MessageId,
}),
]);
```
> ロングポーリング消費では `GrpcPushConsumer` を直接利用することもできます(PUSH_CONSUMER セマンティクスで、自動 ACK とリトライを内蔵)。
>
> **5.x POP のリトライとデッドレター**:消費に失敗したメッセージは Broker が `%RETRY%{group}_{topic}` に書き込み、`popFromRetryProbability` に従って元トピックのプル応答にマージし直します。クライアントは元トピックを消費するだけで済みます。配送回数が `GrpcPushConsumer.MaxDeliveryAttempts`(既定 16)に達すると、メッセージは `%DLQ%{group}` に移動します。手動受信のシナリオでは `Consumer.ForwardToDeadLetterQueueViaGrpcAsync` を呼び出します(`GetGrpcDlqTopic()` はデッドレタートピック名を返します)。不可視時間の下限は 10 秒です(ライブラリ内部で自動的に確定)。それより小さい値は Broker に拒否されます。
>
> デッドレターのメッセージは 1 回で処理し切る必要があります:`dotnet run --file scripts/DlqTool.cs -- --group <コンシューマーグループ> --to <元トピック>` はデッドレターキューからメッセージを再公開し、再公開に成功したメッセージだけを ACK します。デッドレターのメッセージをプルすると消費オフセットが進み、ACK していないメッセージは Broker によって `%RETRY%{group}_%DLQ%{group}` へ移動します。そのため、デッドレターキューの読み取り専用の参照はサポートされません。
>
> **FIFO 順序メッセージとトランザクションメッセージ**:トピック種別はメッセージ種別と一致させる必要があり、`CreateTopic(topic, queueNum, 0, TopicMessageType.Fifo/Transaction)` で作成します。FIFO 送信では `Message.MessageGroup` を設定します。Consumer 側では `GrpcPushConsumer.Orderly = true` を設定すると直列に処理され、順序が保持されます。トランザクションメッセージでは、ハーフメッセージの送信に `PublishTransactionViaGrpcAsync`、コミットまたはロールバックに `EndTransactionViaGrpcAsync` を使用します(コミットしない場合、Broker がタイムアウト後にロールバックします)。
### 遅延メッセージ
```csharp
// 18 段階のプリセット遅延レベル
producer.PublishDelay("delayed message", DelayTimeLevels.s30);
// gRPC モードでは任意の遅延に対応(netstandard2.1+ が必要)
producer.GrpcProxyAddress = "http://127.0.0.1:8081";
await producer.PublishDelayViaGrpcAsync("arbitrary delay", DateTime.Now.AddMinutes(30));
```
### トランザクションメッセージ
```csharp
var producer = new Producer
{
Topic = "tx_topic",
Group = "tx_group",
NameServerAddress = "127.0.0.1:9876"
};
// トランザクションのコールバック確認
producer.OnCheckTransaction = (msg, transactionId) =>
{
var success = CheckLocalTransaction(transactionId);
return success ? TransactionState.Commit : TransactionState.Rollback;
};
producer.Start();
// ハーフメッセージ送信 -> ローカルトランザクション実行 -> コミット/ロールバック
var sendResult = producer.PublishTransaction("order created");
try
{
ExecuteLocalTransaction(sendResult.TransactionId);
producer.EndTransaction(sendResult, TransactionState.Commit);
}
catch
{
producer.EndTransaction(sendResult, TransactionState.Rollback);
}
```
### 順序メッセージ
```csharp
// 同じキーのメッセージは同じキューに送られます
var queue = producer.SelectQueue("order_123");
producer.Publish("ordered message 1", queue);
producer.Publish("ordered message 2", queue);
// Consumer 側で順序消費を有効化
consumer.OrderConsume = true;
```
### リクエスト-リプライパターン
```csharp
// Producer がリクエストを送信(同期/非同期)
var response = producer.Request("request message", timeout: 5000);
var reply = await producer.RequestAsync("async request", timeout: 5000);
// Consumer がリプライを返す
consumer.OnConsume = (q, messages) =>
{
foreach (var msg in messages)
{
if (!String.IsNullOrEmpty(msg.CorrelationId))
consumer.SendReply(msg, "processing result");
}
return true;
};
```
### デュアルプロトコルメッセージ変換
```csharp
// Remoting メッセージを gRPC メッセージへ変換(netstandard2.1+ が必要)
var grpcMsg = message.ToGrpcMessage();
// gRPC メッセージを拡張 Remoting メッセージ / 基本メッセージへ変換
var ext = grpcMsg.ToMessageExt(); // MessageExt(すべてのシステムプロパティを含む)
var msg = grpcMsg.ToMessage(); // Message(基本フィールド)
```
---
### イベントバス
```csharp
using NewLife.Messaging;
using NewLife.RocketMQ;
// イベントトピックにはドットを含められます。名前は RocketMQ の有効な名前に正規化されます(order.created -> order_created)
using var bus = new RocketMqEventBus<OrderPaidEvent>("127.0.0.1:9876", "order.created", "order_service");
// 購読:ハンドラーが例外を投げると再配信され、上限を超えるとデッドレターキューに入ります
await bus.SubscribeAsync((OrderPaidEvent e, IEventContext ctx) =>
{
Console.WriteLine($"注文支払い完了: {e.OrderId}");
return Task.CompletedTask;
}, "billing");
// 発行:Broker 経由で配信され、ローカルの購読者もコンシューマーグループ経由で受け取ります
await bus.PublishAsync(new OrderPaidEvent { OrderId = 1001 });
// イベントハブへの接続:ファクトリがトピックごとにバスを作成してキャッシュします
var hub = new EventHub<OrderPaidEvent>
{
Factory = new RocketMqEventBusFactory("127.0.0.1:9876"),
};
```
> コンシューマーグループは既定で現在のノード識別子を使用するため、各ノードがすべてのイベントを受信します。「グループ全体で 1 回だけ処理」したい場合は、同じ clientId を渡して競合コンシューマーのセマンティクスに切り替えてください。バッチの一部が失敗するとバッチ全体が再配信されるため、ハンドラーは冪等に保つ必要があります。
---
## Consumer の高度な機能
### コンシュームリトライとデッドレターキュー
```csharp
var consumer = new Consumer
{
Topic = "test_topic",
Group = "consumer_group",
NameServerAddress = "127.0.0.1:9876",
EnableRetry = true, // コンシュームリトライを有効化
MaxReconsumeTimes = 3 // 最大リトライ回数。超過したメッセージは %DLQ% デッドレターキューへ
};
consumer.OnConsume = (q, messages) =>
{
foreach (var msg in messages)
{
try { ProcessMessage(msg); }
catch { return false; } // false を返すとリトライが発生します
}
return true;
};
```
### タグ / SQL92 フィルタリング
```csharp
// タグフィルタリング
consumer.Tags = "TagA || TagB";
// SQL92 式フィルタリング
consumer.ExpressionType = "SQL92";
consumer.Subscription = "age > 18 AND city = 'Shanghai'";
```
### マルチトピック購読
```csharp
consumer.Topics = "topic1;topic2;topic3";
```
### Pop 消費モード
```csharp
// Pop 消費(手動 ACK)
var messages = await consumer.PopMessageAsync(timeout: 10000);
foreach (var msg in messages)
{
try
{
ProcessMessage(msg);
await consumer.AckMessageAsync(msg);
}
catch
{
await consumer.ChangeInvisibleTimeAsync(msg, 30000); // 処理時間を延長
}
}
```
### 消費スロットリング / VIP チャネル / メッセージ圧縮
```csharp
consumer.MaxConcurrentConsume = 10; // 同時に処理するメッセージは最大 10 件
producer.VipChannelEnabled = true; // VIP チャネル(BrokerPort - 2)を有効化
producer.CompressOverBytes = 4096; // 4KB を超えるメッセージボディを自動で ZLIB 圧縮
```
### HTTP ブリッジ(MQ -> WebAPI)
消費したメッセージを WebAPI へ転送する場合や、外部からメッセージを発行できる WebAPI を公開する場合は、既存の API を組み合わせて実現できます。詳しくは [HTTP ブリッジガイド](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/Doc/HttpBridge_Guide.md) を参照してください。
---
## クラウドプロバイダー接続
### Alibaba Cloud ApsaraMQ for RocketMQ
```csharp
var producer = new Producer
{
Topic = "test_topic",
NameServerAddress = "http://MQ_INST_xxx.aliyuncs.com:80",
CloudProvider = new AliyunProvider
{
AccessKey = "your AccessKey",
SecretKey = "your SecretKey",
InstanceId = "MQ_INST_xxx" // 省略可能。アドレスから自動解析されます
}
};
```
### Huawei Cloud DMS for RocketMQ
```csharp
var producer = new Producer
{
Topic = "test_topic",
NameServerAddress = "Huawei Cloud instance address:9876",
CloudProvider = new HuaweiProvider
{
AccessKey = "your AK",
SecretKey = "your SK",
InstanceId = "instance ID",
EnableSsl = true
}
};
```
### Tencent Cloud TDMQ RocketMQ
```csharp
var producer = new Producer
{
Topic = "test_topic",
NameServerAddress = "Tencent Cloud instance address:9876",
CloudProvider = new TencentProvider
{
AccessKey = "Tencent Cloud SecretId",
SecretKey = "Tencent Cloud SecretKey",
Namespace = "namespace"
}
};
```
### Apache RocketMQ ACL 認証
```csharp
var producer = new Producer
{
Topic = "test_topic",
NameServerAddress = "127.0.0.1:9876",
CloudProvider = new AclProvider
{
AccessKey = "RocketMQ AccessKey",
SecretKey = "RocketMQ SecretKey"
}
};
```
---
## NativeAOT 公開
`net10.0` ターゲットのみが NativeAOT/トリミングに対応します(旧ターゲットフレームワークにはトリミングの概念がなく、動作は変わりません)。パッケージにはソース生成のメンバーアクセサーとメタデータルートが既に含まれているため、利用時に追加の構成は不要です:
```xml
<PropertyGroup>
<PublishAot>true</PublishAot>
</PropertyGroup>
```
```powershell
dotnet publish -c Release -r linux-x64
```
検証済みのシナリオ(ネイティブ実行ファイルで計測):フレームのエンコード/デコード、リクエストヘッダーのプロパティ辞書、JSON シリアル化、メッセージ圧縮(ZLIB の往復と展開上限)、LMQ プロパティ、ACL 署名、クラウドプロバイダーアダプター、デュアルプロトコル変換、エンドツーエンドの送受信(通常/オブジェクトボディ/バッチ/遅延/大容量メッセージ圧縮、消費、オフセット照会、順序ロック、POP)、および gRPC 5.x 経路(ルーティング、送受信 ACK、プッシュ消費、デッドレター転送、FIFO 順序消費)。
CI カバレッジ:win-x64(ローカル RocketMQ の完全なエンドツーエンドを含む)、linux-x64、linux-arm64、win-arm64、osx-x64/osx-arm64、linux-musl-x64/arm64 はそれぞれネイティブ公開して実行します。Loongson linux-loongarch64 は QEMU ユーザーモードエミュレーションと Loongson SDK で実行します(現在このプラットフォームには公式の NativeAOT サポートがないため、AOT 相当のエンジニアリング JIT スモークテストを判定基準としています)。
**カスタム型のオブジェクトボディは登録が必要**:カスタム型(POCO)をメッセージボディとして使用すると、トリマーがその公開プロパティを既定で削除し、オブジェクトボディは空のオブジェクト `{}` として暗黙にシリアル化されます。アプリケーションの起動時に、メッセージボディとして使用する型を 1 回登録してください:
```csharp
MqAot.RegisterBodyType<MyOrder>();
MqAot.RegisterBodyType<MyEvent>();
```
`MqAot.RegisterBodyType<T>()` は net10.0 でのみトリミング保持のセマンティクスを持ち、他のターゲットでは何もしません。そのため、マルチターゲットのプロジェクトでも同じ起動コードを共有できます。ライブラリと同じパターン(`[DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties, typeof(MyOrder))]` + `[ModuleInitializer]`)で独自のメタデータルートを宣言することもできます。
---
## アーキテクチャ概要
```
MqBase(業務基底クラス)
├── Producer
└── Consumer
通信層
├── Remoting プロトコル(4.x/5.x Broker)
│ ├── ClusterClient(TCP 長接続、Opaque 再利用)
│ ├── NameClient(ルート探索、30 秒ポーリング)
│ └── BrokerClient(ハートビート/登録解除)
│
└── gRPC プロトコル(5.x Proxy、netstandard2.1+)
├── GrpcClient(HTTP/2、Unary + Server Streaming + 書き込み専用長接続)
├── GrpcMessagingService(11 個の RPC メソッド)
├── GrpcTelemetrySession(リソース報告長接続:定期再送 + 切断時再接続)
├── MessageConverter(Remoting ↔ gRPC メッセージ変換)
└── フィールドコーデック(SpanWriter/SpanReader による手書き Protobuf)
クラウドプロバイダーアダプター層
├── AliyunProvider (Alibaba Cloud:インスタンス ID ルーティング + HTTP NameServer)
├── HuaweiProvider (Huawei Cloud:SSL/TLS + インスタンス ID ルーティング)
├── TencentProvider (Tencent Cloud:Namespace プレフィックスルーティング)
└── AclProvider (Apache ACL:HMAC-SHA1 署名)
```
詳しくは [要件ドキュメント](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/Doc/需求文档.md)、[機能一覧](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/Doc/功能清单.md)、[アーキテクチャ設計](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/Doc/架构设计.md)、[競合分析](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/Doc/竞品分析.md)、[HTTP ブリッジガイド](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/Doc/HttpBridge_Guide.md)、[多言語ローカライズ](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/Doc/多语言本地化.md) を参照してください。
---
## 機能一覧
### Producer
| 機能 | 状態 | 説明 |
|---------|:------:|-------------|
| 同期/非同期/一方向送信 | ✅ | Publish / PublishAsync / PublishOneway |
| バッチメッセージ送信 | ✅ | PublishBatch。複数メッセージを 1 リクエストにまとめて送信 |
| 遅延メッセージ | ✅ | 18 段階のプリセット + gRPC による任意遅延 |
| トランザクションメッセージ | ✅ | ハーフメッセージ + コミット/ロールバック + コールバック確認 |
| 順序メッセージ | ✅ | 指定した MessageQueue へ送信 |
| リクエスト-リプライ | ✅ | 同期/非同期のリクエスト-リプライ |
| メッセージ圧縮 | ✅ | CompressOverBytes のしきい値を超えると自動で ZLIB 圧縮 |
| メッセージトレース | ✅ | AsyncTraceDispatcher + MessageTraceHook |
### Consumer
| 機能 | 状態 | 説明 |
|---------|:------:|-------------|
| プル消費 / 消費スケジューリング | ✅ | ロングポーリングプルと自動キュー割り当て |
| クラスタ/ブロードキャスト消費 | ✅ | Rebalance の平均割り当て / ローカルオフセット永続化 |
| タグ / SQL92 フィルタリング | ✅ | 式によるフィルタリング |
| マルチトピック購読 | ✅ | Topics プロパティ。トピックごとに Rebalance |
| コンシュームリトライ + デッドレターキュー | ✅ | EnableRetry + MaxReconsumeTimes |
| 順序消費 | ✅ | キューロック(OrderConsume) |
| Pop 消費 | ✅ | Pop/Ack/BatchAck/ChangeInvisibleTime |
| 消費スロットリング | ✅ | MaxConcurrentConsume によるセマフォ制御 |
### イベントバス
| 機能 | 状態 | 説明 |
|------|:----:|------|
| Core IEventBus 契約 | ✅ | RocketMqEventBus<TEvent> / RocketMqEventContext |
| プロセス間 Pub/Sub | ✅ | Producer が発行し、Consumer のコンシューマーグループが購読。失敗はリトライ/デッドレターへ |
| イベントハブファクトリ | ✅ | RocketMqEventBusFactory が IEventBusFactory を実装し、EventHub.Factory に接続可能 |
| 名前の正規化 | ✅ | MqEventBusNaming:不正文字をアンダースコアに変換し、127 文字で切り捨て |
### 管理と運用
| 機能 | 状態 | 説明 |
|---------|:------:|-------------|
| トピック/コンシューマーグループの CRUD | ✅ | 作成/更新/削除 |
| メッセージ照会 | ✅ | ID 指定 / Key 指定 |
| 消費統計 / クラスタ情報 | ✅ | GetConsumeStats / GetClusterInfo |
| オフセット管理とリセット | ✅ | 照会/更新/リセット |
### プロトコルと互換性
| サーバーバージョン | Remoting | gRPC | 説明 |
|----------------|:--------:|:----:|-------------|
| RocketMQ 4.0 ~ 4.9 | ✅ | — | 完全互換 |
| RocketMQ 5.x(Broker) | ✅ | — | Remoting は後方互換 |
| RocketMQ 5.x(Proxy) | — | ✅ | GrpcProxyAddress で有効化 |
| Alibaba Cloud 4.x | ✅ | — | AliyunProvider アダプター |
| Huawei Cloud DMS | ✅ | — | HuaweiProvider アダプター |
| Tencent Cloud TDMQ | ✅ | — | TencentProvider アダプター |
---
## テストカバレッジ
xUnit テストスイートは、コア機能、高度な機能、プロトコル互換性、クラウドプロバイダーアダプター、E2E 統合テストを網羅しています(gRPC 統合ケースは Proxy が未構成の場合に自動的にスキップされます)。また、Apache ACL 2.0 の認証セマンティクスを Remoting と gRPC の両方で検証します(資格情報なし、非管理者ユーザー、誤ったキーによるリクエストは拒否され、管理者は正常に送受信できます)。単体テストはテストクラス単位で並列実行され、`dotnet test XUnitTestRocketMQ/XUnitTest.csproj --filter "Category!=Integration"` は約 4 秒で完了します。実際の Broker に依存する統合ケースは RocketMQ コレクションに配置され、共有トピックやコンシューマーグループによる干渉を避けるため直列実行されます。トラブルシューティング時にフレームワークのログを復元するには `ROCKETMQ_TEST_VERBOSE=1` を設定します。CI は RID マトリクスで実行されます。単体テストと AOT スモークテストは win-x64 / linux-x64 / linux-arm64 / Loongson LA64(QEMU エミュレーション、必須)をカバーし、win-arm64、osx の 2 アーキテクチャ、linux-musl の 2 アーキテクチャは観察期間中です。すべて手動トリガーに対応しています。
あわせて以下も含まれます:NativeAOT スモークテスト(`AotSmoke`。メッセージ圧縮、LMQ、ACL 署名、gRPC 経路、デッドレター転送、FIFO 順序消費を含む)、NuGet パッケージ消費側の AOT スモークテスト(`AotPackageSmoke`。PackageReference でパッケージ化した成果物を消費し、パッケージアセット、ソース生成シリアル化、圧縮、エンドツーエンドの送受信をカバー)、公開ベースライン収集(`scripts/AotBaseline.cs`。サイズ/起動オーバーヘッド/スループットを報告し、しきい値チェックと CI のパイプラインサマリーへの書き出しを行う)、AOT/JIT 性能比較ベンチマーク(BenchmarkDotNet ベースの `Benchmark` プロジェクト。割り当て統計を含む。AOT 側は `AotSmoke --bench` による多回サンプリングを使用)、デッドレター運用ツール(`scripts/DlqTool.cs`。`%DLQ%{group}` のメッセージを指定トピックへ再公開)、gRPC 安定性受け入れスクリプト(`scripts/GrpcStability.cs`。CI で毎晩実行し、Proxy の再起動を 1 回注入)。
### ローカル統合テスト(Windows)
```powershell
# NameServer + Broker + Proxy のワンステップでのインストールと起動(ストアは毎回クリアされます)
dotnet run --file scripts/RocketMqSetup.cs
$env:ROCKETMQ_NAMESERVER = "127.0.0.1:9876"
dotnet test XUnitTestRocketMQ\XUnitTest.csproj -c Release
# 停止 / 状態確認
dotnet run --file scripts/RocketMqSetup.cs -- --stop
dotnet run --file scripts/RocketMqSetup.cs -- --status
```
ローカル起動は既定で低リソースモードを使用します。3 つの JVM のログは WARN に抑えられ(`%USERPROFILE%\logs\rocketmqlogs` へは出力されません)、非同期フラッシュ間隔は 5 秒、commitlog は 64MB、スレッドプールは絞り込まれ、ストアは毎回クリアされるため Broker は常に新しい状態です。トラブルシューティング時は `--log-level INFO`(または `$env:ROCKETMQ_TEST_LOG_LEVEL="INFO"`)で詳細ログを復元できます(ログ量は明らかに増えます)。gRPC が不要な場合は `--no-proxy` で JVM を 1 つ減らせます。ストアを RAM ディスクに置く場合は `--store-dir R:\RocketMQ\store` を使用します。
---
## コントリビューション
Issue と Pull Request を歓迎します!
1. このリポジトリをフォークします
2. 機能ブランチを作成します(`git checkout -b feature/AmazingFeature`)
3. 変更をコミットします(`git commit -m 'Add some AmazingFeature'`)
4. ブランチにプッシュします(`git push origin feature/AmazingFeature`)
5. Pull Request を作成します
---
## ライセンス
本プロジェクトは [MIT License](/NewLife/NewLife.RocketMQ/Blob/v4.0.2026.1024/LICENSE) に基づいて公開されています。
---
## エコシステムマップ
NewLife は、独立したバージョン管理を行うオープンソースプロジェクトの階層型エコシステムです。以下のマップはすべての NewLife リポジトリで逐語的に同一の内容を共有しており、各プロジェクトはコードリポジトリと主要な NuGet パッケージにリンクしています。
| プロジェクト | 概要 | ダウンロード数 |
| --- | --- | --- |
| **基盤** | | |
| [NewLife.Core](https://github.com/NewLifeX/X) | ログ、構成、キャッシュ、ネットワーク、シリアライズ、スケジューリング、APM トレーシング。 | [](https://www.nuget.org/packages/NewLife.Core) |
| [NewLife.XCode](https://github.com/NewLifeX/NewLife.XCode) | データミドルウェア:単一テーブルで数百億件級、自動シャーディング、読み書き分離、10 種類以上のデータベースに対応。 | [](https://www.nuget.org/packages/NewLife.XCode) |
| [NewLife.Net](https://github.com/NewLifeX/NewLife.Net) | 高性能ネットワークライブラリ:単一マシンで 177 万 pps、14.5 Gbps(TCP 1KB、2026-10 実測)、400 万 Tcp 長接続。 | [](https://www.nuget.org/packages/NewLife.Net) |
| [NewLife.Remoting](https://github.com/NewLifeX/NewLife.Remoting) | CS アプリケーションと IoT デバイス向けのプロトコル通信と RPC フレームワーク。 | [](https://www.nuget.org/packages/NewLife.Remoting) |
| [NewLife.Agent](https://github.com/NewLifeX/NewLife.Agent) | .NET アプリケーションを OS デーモンとしてインストール:Windows サービスと Linux systemd。 | [](https://www.nuget.org/packages/NewLife.Agent) |
| [NewLife.Templates](https://github.com/NewLifeX/NewLife.Zero) | コンソール、Web、API、サービス、データ、IoT 向けの `dotnet new` プロジェクトテンプレート。 | [](https://www.nuget.org/packages/NewLife.Templates) |
| **データとメッセージング** | | |
| [NewLife.Redis](https://github.com/NewLifeX/NewLife.Redis) | マイクロ秒級の遅延、数百万 ops/s のスループット、メッセージキュー内蔵の Redis クライアント。 | [](https://www.nuget.org/packages/NewLife.Redis) |
| [NewLife.RocketMQ](https://github.com/NewLifeX/NewLife.RocketMQ) | Apache RocketMQ と Alibaba Cloud Message Queue に対応した純マネージド RocketMQ クライアント。 | [](https://www.nuget.org/packages/NewLife.RocketMQ) |
| [NewLife.MQTT](https://github.com/NewLifeX/NewLife.MQTT) | MQTT クライアントとサーバー。Alibaba Cloud IoT への接続を含みます。 | [](https://www.nuget.org/packages/NewLife.MQTT) |
| [NewLife.NovaDb](https://github.com/NewLifeX/NewLife.NovaDb) | C# 製ハイブリッドデータベース:組み込み/ネットワークの両モード、リレーショナル、時系列、メッセージキュー、KV を 1 つに。 | [](https://www.nuget.org/packages/NewLife.NovaDb) |
| [NewLife.MySql](https://github.com/NewLifeX/NewLife.MySql) | NewLife データスタック上に構築された MySql ドライバーとヘルパー層。 | [](https://www.nuget.org/packages/NewLife.MySql) |
| **Web、AI、分散** | | |
| [NewLife.Cube](https://github.com/NewLifeX/NewLife.Cube) | 高速管理プラットフォームフレームワーク:権限、SSO、OAuth サーバー、CRUD スキャフォールディング。 | [](https://www.nuget.org/packages/NewLife.Cube) |
| [Stardust](https://github.com/NewLifeX/Stardust) | 分散サービスプラットフォーム:ノード管理、APM、構成センター、登録センター、リリースセンター。 | [](https://www.nuget.org/packages/NewLife.Stardust) |
| [AntJob](https://github.com/NewLifeX/AntJob) | シャーディング、リトライ、バックフィルに対応した分散タスクとリアルタイムデータのスケジューリングプラットフォーム。 | [](https://www.nuget.org/packages/NewLife.AntJob) |
| [NewLife.AI](https://github.com/NewLifeX/NewLife.AI) | 46 社の LLM プロバイダーに統一接続するクライアントと、すぐに使える Web チャットアプリ ChatAI。 | [](https://www.nuget.org/packages/NewLife.AI) |
| **産業と IoT** | | |
| [NewLife.IoT](https://github.com/NewLifeX/NewLife.IoT) | プロトコル契約とデバイス抽象を定義する IoT 標準ライブラリ。 | [](https://www.nuget.org/packages/NewLife.IoT) |
| [NewLife.Modbus](https://github.com/NewLifeX/NewLife.Modbus) | NewLife.IoT 上に実装された Modbus TCP/RTU/ASCII。 | [](https://www.nuget.org/packages/NewLife.Modbus) |
| [NewLife.Siemens](https://github.com/NewLifeX/NewLife.Siemens) | NewLife.IoT 上に実装されたシーメンス PLC プロトコル。 | [](https://www.nuget.org/packages/NewLife.Siemens) |
| [NewLife.Omron](https://github.com/NewLifeX/NewLife.Omron) | NewLife.IoT 上に実装されたオムロン PLC プロトコル。 | [](https://www.nuget.org/packages/NewLife.Omron) |
| [NewLife.Melsec](https://github.com/NewLifeX/NewLife.Melsec) | NewLife.IoT 上に実装された三菱 Melsec PLC プロトコル。 | [](https://www.nuget.org/packages/NewLife.Melsec) |
| [NewLife.OPC](https://github.com/NewLifeX/NewLife.OPC) | 産業データアクセス向けの OPC クライアント。 | — |
| [NewLife.BACnet](https://github.com/NewLifeX/NewLife.BACnet) | BACnet ビル管理プロトコルスタック。 | [](https://www.nuget.org/packages/NewLife.BACnet) |
| [ZeroIoT](https://github.com/NewLifeX/ZeroIoT) | ゲートウェイとデバイス管理を備えた軽量なオープンソース IoT プラットフォーム。 | — |
| **車載テレマティクス** | | |
| [NewLife.JT808](https://github.com/NewLifeX/NewLife.JT808) | JT/T 808 車両位置情報プロトコル:70 以上のメッセージボディ、2011/2013/2019 に対応。 | [](https://www.nuget.org/packages/NewLife.JT808) |
| [NewLife.JT809](https://github.com/NewLifeX/NewLife.JT809) | 運輸管理部門向けの JT/T 809 プラットフォーム間プロトコル。 | [](https://www.nuget.org/packages/NewLife.JT809) |
| [NewLife.JT1078](https://github.com/NewLifeX/NewLife.JT1078) | JT/T 1078 車載ビデオ:RTP 解析、FLV/fMP4 リマックス、ライブ配信。 | [](https://www.nuget.org/packages/NewLife.JT1078) |
| **ドメインコンポーネント** | | |
| [NewLife.Office](https://github.com/NewLifeX/NewLife.Office) | Excel、Word、PPT、PDF など 15 以上のドキュメント形式を 1 パッケージで。 | [](https://www.nuget.org/packages/NewLife.Office) |
| [NewLife.Audio](https://github.com/NewLifeX/NewLife.Audio) | クロスプラットフォーム音声:コーデック、デバイス IO、DSP、コンテナ、ストリーミング。 | [](https://www.nuget.org/packages/NewLife.Audio) |
| [NewLife.Video](https://github.com/NewLifeX/NewLife.Video) | ビデオコーデック、コンテナ形式、フレーム処理、ストリーミング。 | [](https://www.nuget.org/packages/NewLife.Video) |
| [NewLife.Map](https://github.com/NewLifeX/NewLife.Map) | 百度地図、高徳地図、テンセント地図、天地図を統一インターフェイス化。ジオコーディングと座標変換に対応。 | [](https://www.nuget.org/packages/NewLife.Map) |
| [NewLife.IP](https://github.com/NewLifeX/NewLife.IP) | IPv4 位置情報:オフラインのメモリマップデータベースとオンライン API のフォールバック。 | [](https://www.nuget.org/packages/NewLife.IP) |
| **ツールと製品** | | |
| [CrazyCoder](https://github.com/NewLifeX/XCoder) | 開発者向けツールボックス:ネットワーク、シリアルポート、暗号化、正規表現、Modbus、MQTT。 | [](https://www.nuget.org/packages/NewLife.XCoder) |
| [GitCandy](https://github.com/NewLifeX/GitCandy) | セルフホスト型 Git ソースコード管理システム。 | — |
| [LuckyClover](https://github.com/NewLifeX/LuckyClover) | 古いホストから起動した際に対応する .NET ランタイムを自動インストールします。 | — |
> バッジは各プロジェクトの主要パッケージを示します。テーマ、拡張、サテライトパッケージは各 NuGet ページを参照してください。ここに記載していない 30 以上のパッケージ(FTP、LoRa、Office 拡張、各種プロトコルドライバーなど)は [NewLifeX 組織](https://github.com/NewLifeX) と [newlifex.com](https://newlifex.com) で公開しています。
---
## 新生命開発チーム
<img src="https://newlifex.com/logo.png" width="48" align="right" alt="NewLife" />
新生命チームは 2002 年に設立され、20 年以上にわたり .NET と IoT の技術エコシステムに注力し、100 近いオープンソースプロジェクトを主導し(うち 34 が主要プロジェクト)、電力、物流、医療、産業制御、インターネットなどの業界にソフトウェアとハードウェアを一体化したソリューションを提供しています。「学問に先後なし、達する者が師である」を信条としています。
オープンソースコンポーネントは NuGet で累計 <!--nuget-total:start-->6.48M<!--nuget-total:end--> 回ダウンロードされています(エコシステム全体、2026-10 時点)。
ウェブサイト:https://newlifex.com · オープンソース組織:https://github.com/NewLifeX
<details>
<summary>WeChat 公式アカウント:智能大石头(スキャンしてフォロー)</summary>

</details>
|