Foundatio.RabbitMQ 10.7.1
前缀已保留
dotnet add package Foundatio.RabbitMQ --version 10.7.1
NuGet\Install-Package Foundatio.RabbitMQ -Version 10.7.1
<PackageReference Include="Foundatio.RabbitMQ" Version="10.7.1" />
paket add Foundatio.RabbitMQ --version 10.7.1
#r "nuget: Foundatio.RabbitMQ, 10.7.1"
// Install Foundatio.RabbitMQ as a Cake Addin #addin nuget:?package=Foundatio.RabbitMQ&version=10.7.1 // Install Foundatio.RabbitMQ as a Cake Tool #tool nuget:?package=Foundatio.RabbitMQ&version=10.7.1
构建松散耦合分布式应用的插件式基础组件。
包括Redis、Azure、AWS、RabbitMQ、Kafka和内存中的实现(用于开发)。
为何选择Foundatio?
在构建几个大型云应用时,我们发现缺少优秀的解决方案(这并不是说没有解决方案),这些解决方案用于构建可扩展的分布式应用,同时保持开发体验简单。以下是构建和使用Foundatio的一些原因:
- 想要使用抽象接口,这样我们可以轻松地更改实现。
- 希望模块依赖注入友好。
- 缓存:我们最初使用开源Redis缓存客户端,但后来它变成了一个具有高额许可费用的商业产品。不仅如此,还没有内存实现,因此每个开发者都需要设置和配置Redis。
- 消息总线:最初我们考虑了NServiceBus(一款优秀的产品),但它有高昂的许可费用(他们也需要吃饭),而且不是开源友好型。我们也研究了MassTransit(另一款优秀的产品),但当时发现Azure支持不足,本地设置麻烦(对于内存中的)。我们想要一个简单易用的消息总线,能够在本地或云环境中运行。
- 存储:我们没有找到任何现有项目,既是解耦的,又支持内存、文件存储或Azure Blob存储。
总结一下,如果您想轻松地进行开发和测试,同时允许您的应用进行扩展,请使用Foundatio!
实现
- Redis - 缓存、存储、队列、消息传递、锁、度量
- Azure存储 - 存储、队列
- Azure ServiceBus - 队列、消息传递
- AWS - 存储、队列、度量
- Kafka - 消息传递
- RabbitMQ - 消息传递
- Minio - 存储
- Aliyun - 存储
- SshNet - 存储
入门(开发)
通过NuGet包管理器可以安装Foundatio。如果您需要帮助,请打开一个问题或加入我们的Discord聊天室。如果您有任何问题,我们随时在此为您提供帮助!
本节仅用于开发目的!如果您正在尝试使用Foundatio库,请从NuGet获取。
- 您需要安装Visual Studio Code。
- 打开
Foundatio.sln
Visual Studio解决方案文件。
使用Foundatio
下述章节仅包含了Foundatio功能的一小部分。我们建议您查看源代码以获取更多信息。如果您有任何问题或需要帮助,请告诉我们!
缓存
缓存允许您以闪电般的速度存储和访问数据,从而节省您创建或获取数据时所花费的昂贵操作。我们提供了四种不同的缓存实现,它们均继承自ICacheClient
接口
- InMemoryCacheClient:一种内存中的缓存客户端实现。这种缓存实现只对进程的生存期有效。值得注意的是,内存中的缓存客户端可以通过
MaxItems
属性缓存最后X项。我们在Exceptionless中使用它来仅保持最后250个解析过的geoip结果。 - HybridCacheClient:这种缓存实现同时使用
ICacheClient
和InMemoryCacheClient
,并使用IMessageBus
来确保跨进程缓存同步。这可以带来巨大的性能提升,因为如果您要缓存的项存在于本地缓存中,则可以节省序列化操作和远程缓存的调用。 - RedisCacheClient:Redis缓存客户端实现。
- RedisHybridCacheClient:一个使用
RedisCacheClient
作为ICacheClient
并使用RedisMessageBus
作为IMessageBus
的HybridCacheClient
实现。 - ScopedCacheClient:这种缓存实现使用
ICacheClient
的实例和一个字符串scope
。范围将添加到每个缓存键之前。这使得对所有缓存键进行范围划分和轻松删除变得非常简单。
示例
using Foundatio.Caching;
ICacheClient cache = new InMemoryCacheClient();
await cache.SetAsync("test", 1);
var value = await cache.GetAsync<int>("test");
队列
队列提供先进先出(FIFO)消息传递。我们提供了四个不同的队列实现,这些实现源自于IQueue
接口
- InMemoryQueue:内存队列实现。此队列实现仅对进程的生存期有效。
- RedisQueue:Redis队列实现。
- AzureServiceBusQueue:Azure Service Bus Queue实现。
- AzureStorageQueue:Azure Storage Queue实现。
- SQSQueue:AWS SQS实现。
示例
using Foundatio.Queues;
IQueue<SimpleWorkItem> queue = new InMemoryQueue<SimpleWorkItem>();
await queue.EnqueueAsync(new SimpleWorkItem {
Data = "Hello"
});
var workItem = await queue.DequeueAsync();
锁
锁确保资源在任何给定时间只被一个消费者访问。我们提供了两个不同的锁实现,这些实现源自于ILockProvider
接口
- CacheLockProvider:一个使用缓存在进程之间进行通信的锁实现。
- ThrottlingLockProvider:一个仅允许一定数量的锁通过的锁实现。您可以将其用于限制对外部服务的API调用,并且它将跨所有请求该锁的进程进行限制。
- ScopedLockProvider:这个锁实现接受一个
ILockProvider
的实例和一个字符串scope
。范围添加到每个锁键之前。这使得对所有锁进行范围划分和轻松释放变得非常简单。
值得一提的是,所有锁提供程序都接受一个ICacheClient
。这允许您确保您的代码在机器之间正确地锁定。
示例
using Foundatio.Lock;
ILockProvider locker = new CacheLockProvider(new InMemoryCacheClient(), new InMemoryMessageBus());
var testLock = await locker.AcquireAsync("test");
// ...
await testLock.ReleaseAsync();
ILockProvider throttledLocker = new ThrottlingLockProvider(new InMemoryCacheClient(), 1, TimeSpan.FromMinutes(1));
var throttledLock = await throttledLocker.AcquireAsync("test");
// ...
await throttledLock.ReleaseAsync();
消息传递
允许您发布和订阅应用程序中流过的消息。我们提供了四个不同的消息总线实现,这些实现源自于IMessageBus
接口
- InMemoryMessageBus:内存消息总线实现。此消息总线实现仅对进程的生存期有效。
- RedisMessageBus:Redis消息总线实现。
- RabbitMQMessageBus:RabbitMQ实现。
- KafkaMessageBus:Kafka的实现。
- AzureServiceBusMessageBus:Azure Service Bus的实现。
示例
using Foundatio.Messaging;
IMessageBus messageBus = new InMemoryMessageBus();
await messageBus.SubscribeAsync<SimpleMessageA>(msg => {
// Got message
});
await messageBus.PublishAsync(new SimpleMessageA { Data = "Hello" });
作业
让您能够在不担心提前终止的情况下运行长时间运行的过程(进程内或进程外)。我们根据您的用例提供三种不同的定义任务的方式。
- 任务:所有任务都必须从以下
IJob
接口派生。我们还提供了一个你可以从中派生的JobBase
基类,它提供了Job上下文和日志记录。然后,您可以通过在任务上调用RunAsync()
或在创建JobRunner
类的实例后调用其Run方法来运行任务。JobRunner可以用来轻松地将任务作为Azure Web Jobs运行。
示例
using Foundatio.Jobs;
public class HelloWorldJob : JobBase {
public int RunCount { get; set; }
protected override Task<JobResult> RunInternalAsync(JobContext context) {
RunCount++;
return Task.FromResult(JobResult.Success);
}
}
var job = new HelloWorldJob();
await job.RunAsync(); // job.RunCount = 1;
await job.RunContinuousAsync(iterationLimit: 2); // job.RunCount = 3;
await job.RunContinuousAsync(cancellationToken: new CancellationTokenSource(10).Token); // job.RunCount > 10;
- 队列处理器任务:队列处理器任务非常适合用于从待处理数据驱动的任务。队列处理器任务必须从
QueueJobBase<T>
类派生。然后,您可以通过在任务上调用RunAsync()
或将它传递给JobRunner
类来运行任务。JobRunner可以用来轻松地将任务作为Azure Web Jobs运行。
示例
using Foundatio.Jobs;
public class HelloWorldQueueJob : QueueJobBase<HelloWorldQueueItem> {
public int RunCount { get; set; }
public HelloWorldQueueJob(IQueue<HelloWorldQueueItem> queue) : base(queue) {}
protected override Task<JobResult> ProcessQueueEntryAsync(QueueEntryContext<HelloWorldQueueItem> context) {
RunCount++;
return Task.FromResult(JobResult.Success);
}
}
public class HelloWorldQueueItem {
public string Message { get; set; }
}
// Register the queue for HelloWorldQueueItem.
container.AddSingleton<IQueue<HelloWorldQueueItem>>(s => new InMemoryQueue<HelloWorldQueueItem>());
// To trigger the job we need to queue the HelloWorldWorkItem message.
// This assumes that we injected an instance of IQueue<HelloWorldWorkItem> queue
IJob job = new HelloWorldQueueJob();
await job.RunAsync(); // job.RunCount = 0; The RunCount wasn't incremented because we didn't enqueue any data.
await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunAsync(); // job.RunCount = 1;
await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
await job.RunUntilEmptyAsync(); // job.RunCount = 3;
- 工作项任务:工作项任务将在工作项池中与其它工作项任务一起运行。这类任务非常适合那些不太经常发生但应该作为任务来处理的事项(例如:删除拥有许多子项的实体)。当您在消息总线上发布消息时,它将被触发。任务必须从
WorkItemHandlerBase
类派生。然后,您可以通过JobRunner
类运行所有共享任务。JobRunner可以用来轻松地将任务作为Azure Web Jobs运行。
示例
using System.Threading.Tasks;
using Foundatio.Jobs;
public class HelloWorldWorkItemHandler : WorkItemHandlerBase {
public override async Task HandleItemAsync(WorkItemContext ctx) {
var workItem = ctx.GetData<HelloWorldWorkItem>();
// We can report the progress over the message bus easily.
// To receive these messages just inject IMessageSubscriber
// and Subscribe to messages of type WorkItemStatus
await ctx.ReportProgressAsync(0, "Starting Hello World Job");
await Task.Delay(TimeSpan.FromSeconds(2.5));
await ctx.ReportProgressAsync(50, "Reading value");
await Task.Delay(TimeSpan.FromSeconds(.5));
await ctx.ReportProgressAsync(70, "Reading value");
await Task.Delay(TimeSpan.FromSeconds(.5));
await ctx.ReportProgressAsync(90, "Reading value.");
await Task.Delay(TimeSpan.FromSeconds(.5));
await ctx.ReportProgressAsync(100, workItem.Message);
}
}
public class HelloWorldWorkItem {
public string Message { get; set; }
}
// Register the shared job.
var handlers = new WorkItemHandlers();
handlers.Register<HelloWorldWorkItem, HelloWorldWorkItemHandler>();
// Register the handlers with dependency injection.
container.AddSingleton(handlers);
// Register the queue for WorkItemData.
container.AddSingleton<IQueue<WorkItemData>>(s => new InMemoryQueue<WorkItemData>());
// The job runner will automatically look for and run all registered WorkItemHandlers.
new JobRunner(container.GetRequiredService<WorkItemJob>(), instanceCount: 2).RunInBackground();
// To trigger the job we need to queue the HelloWorldWorkItem message.
// This assumes that we injected an instance of IQueue<WorkItemData> queue
// NOTE: You may have noticed that HelloWorldWorkItem doesn't derive from WorkItemData.
// Foundatio has an extension method that takes the model you post and serializes it to the
// WorkItemData.Data property.
await queue.EnqueueAsync(new HelloWorldWorkItem { Message = "Hello World" });
文件存储
我们提供了多种不同的文件存储实现,这些实现都派生自IFileStorage
接口。
- InMemoryFileStorage:一个内存文件实现。这种文件存储实现仅在进程的生命周期内有效。
- FolderFileStorage:一个使用硬盘进行存储的文件存储实现。
- AzureFileStorage:一个Azure Blob存储实现。
- S3FileStorage:一个AWS S3文件存储实现。
- RedisFileStorage:一个Redis文件存储实现。
- MinioFileStorage:一个Minio文件存储实现。
- AliyunFileStorage:一个阿里云文件存储实现。
- SshNetFileStorage:一个SFTP文件存储实现。
我们建议将所有的 IFileStorage
实现作为单例使用。
示例
using Foundatio.Storage;
IFileStorage storage = new InMemoryFileStorage();
await storage.SaveFileAsync("test.txt", "test");
string content = await storage.GetFileContentsAsync("test.txt")
度量
我们提供了五个继承了IMetricsClient
接口的实现
- InMemoryMetricsClient:一个内存中的度量指标实现。
- RedisMetricsClient:一个Redis度量指标实现。
- StatsDMetricsClient:一个statsd度量指标实现。
- MetricsNETClient:一个Metrics.NET实现。
- AppMetricsClient:一个AppMetrics实现。
- CloudWatchMetricsClient:一个AWS CloudWatch实现。
我们建议将所有的 IMetricsClient
实现作为单例使用。
示例
IMetricsClient metrics = new InMemoryMetricsClient();
metrics.Counter("c1");
metrics.Gauge("g1", 2.534);
metrics.Timer("t1", 50788);
示例应用
我们有幻灯片和一个示例应用,展示了如何使用Foundatio。
感谢所有做出贡献的人
产品 | 版本 兼容的和额外的计算目标框架版本。 |
---|---|
.NET | net5.0 已计算。 net5.0-windows 已计算。 net6.0 已计算。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 已计算。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
.NET Core | netcoreapp2.0 已计算。 netcoreapp2.1 已计算。 netcoreapp2.2 已计算。 netcoreapp3.0 已计算。 netcoreapp3.1 已计算。 |
.NET Standard | netstandard2.0 兼容。 netstandard2.1 已计算。 |
.NET Framework | net461已计算。 net462已计算。 net463已计算。 net47已计算。 net471已计算。 net472已计算。 net48已计算。 net481已计算。 |
MonoAndroid | monoandroid已计算。 |
MonoMac | monomac已计算。 |
MonoTouch | monotouch已计算。 |
Tizen | tizen40已计算。 tizen60已计算。 |
Xamarin.iOS | xamarinios已计算。 |
Xamarin.Mac | xamarinmac已计算。 |
Xamarin.TVOS | xamarintvos已计算。 |
Xamarin.WatchOS | xamarinwatchos已计算。 |
-
.NETStandard 2.0
- Foundatio (>= 10.7.1)
- RabbitMQ.Client (>= 6.8.1)
NuGet 包
此包未被任何 NuGet 包使用。
GitHub 仓库 (1)
显示依赖于 Foundatio.RabbitMQ 的最受欢迎的前 1 个 GitHub 仓库
仓库 | Stars |
---|---|
exceptionless/Exceptionless
Exceptionless 应用
|
版本 | 下载 | 最后更新 |
---|---|---|
10.7.1 | 4,100 | 3/27/2024 |
10.7.0 | 4,999 | 1/5/2024 |
10.6.1 | 3,804 | 6/23/2023 |
10.6.0 | 11,207 | 1/1/2023 |
10.5.0 | 6,470 | 5/18/2022 |
10.4.0 | 3,271 | 3/8/2022 |
10.3.0 | 1,161 | 1/20/2022 |
10.2.2 | 3,316 | 9/23/2021 |
10.2.0 | 3,869 | 8/6/2021 |
10.0.2 | 10,805 | 1/20/2021 |
10.0.0 | 4,089 | 9/16/2020 |
10.0.0-beta9 | 1,497 | 8/25/2020 |
10.0.0-beta8 | 859 | 8/3/2020 |
10.0.0-beta7 | 865 | 7/29/2020 |
10.0.0-beta6 | 1,328 | 7/8/2020 |
10.0.0-beta5 | 1,043 | 6/20/2020 |
10.0.0-beta4 | 1,452 | 6/14/2020 |
10.0.0-beta3 | 921 | 6/6/2020 |
10.0.0-beta2 | 860 | 5/26/2020 |
10.0.0-beta10 | 864 | 9/15/2020 |
10.0.0-beta1 | 895 | 5/26/2020 |
9.0.0 | 4,719 | 1/16/2020 |
8.1.1527 | 3,302 | 8/30/2019 |
8.1.1517 | 3,787 | 5/14/2019 |
8.1.1512 | 2,273 | 4/16/2019 |
8.0.1503 | 1,300 | 2/24/2019 |
8.0.1501 | 1,136 | 2/22/2019 |
7.0.1488 | 1,970 | 9/7/2018 |
7.0.1484 | 1,577 | 5/9/2018 |
6.0.1466 | 1,653 | 11/30/2017 |
5.1.1454 | 1,653 | 5/5/2017 |
5.0.1336 | 1,624 | 3/14/2017 |
5.0.1334 | 1,675 | 3/13/2017 |
5.0.1331 | 1,701 | 3/12/2017 |
5.0.1329-pre | 1,331 | 3/12/2017 |
5.0.1328-pre | 1,361 | 3/12/2017 |
5.0.1327-pre | 1,367 | 3/12/2017 |
5.0.1326-pre | 1,397 | 3/12/2017 |
5.0.1324-pre | 1,367 | 3/12/2017 |
4.3.1323-pre | 1,408 | 3/11/2017 |
4.3.1317 | 1,639 | 2/23/2017 |
4.3.1316 | 1,566 | 2/22/2017 |
4.3.1315 | 1,567 | 2/22/2017 |
4.3.1314 | 1,575 | 2/20/2017 |
4.3.1312 | 1,607 | 2/20/2017 |
4.3.1311-pre | 1,377 | 2/20/2017 |
4.3.1307 | 1,568 | 2/16/2017 |
4.3.1306 | 1,581 | 2/15/2017 |
4.3.1305 | 1,616 | 2/15/2017 |
4.3.1304-pre | 1,324 | 2/15/2017 |
4.3.1303-pre | 1,334 | 2/14/2017 |
4.3.1301 | 1,545 | 2/14/2017 |
4.3.1299 | 1,613 | 2/14/2017 |
4.3.1293 | 1,637 | 2/12/2017 |
4.3.1292 | 1,611 | 2/10/2017 |
4.3.1291 | 1,590 | 2/10/2017 |
4.3.1290 | 1,585 | 2/10/2017 |
4.3.1289 | 1,633 | 2/9/2017 |
4.3.1288 | 1,651 | 2/9/2017 |
4.3.1286 | 1,619 | 2/8/2017 |
4.3.1282 | 1,642 | 2/5/2017 |
4.3.1281 | 1,721 | 2/5/2017 |
4.3.1280 | 1,638 | 2/5/2017 |
4.3.1276-pre | 1,453 | 2/5/2017 |
4.3.1177-pre | 1,327 | 9/2/2016 |
4.3.1164-pre | 1,320 | 8/21/2016 |
4.2.1205-pre | 1,652 | 9/19/2016 |
4.2.1183 | 1,505 | 9/9/2016 |
4.2.1179 | 1,476 | 9/8/2016 |
4.2.1176 | 1,491 | 9/2/2016 |
4.2.1172 | 1,472 | 9/1/2016 |
4.2.1171-pre | 1,321 | 9/1/2016 |
4.2.1169 | 1,488 | 8/22/2016 |
4.2.1167-pre | 1,278 | 8/22/2016 |
4.2.1166-pre | 1,314 | 8/22/2016 |
4.2.1161 | 1,490 | 8/10/2016 |
4.2.1156-pre | 1,293 | 8/2/2016 |
4.2.1155 | 1,499 | 8/1/2016 |
4.2.1150 | 1,497 | 7/20/2016 |
4.2.1149-pre | 1,345 | 7/19/2016 |
4.2.1148-pre | 1,305 | 7/19/2016 |
4.2.1147-pre | 1,338 | 7/19/2016 |
4.2.1146-pre | 1,336 | 7/19/2016 |
4.2.1137 | 1,520 | 7/19/2016 |
4.2.1129-pre | 1,290 | 7/19/2016 |
4.2.1128-pre | 1,328 | 7/19/2016 |
4.2.1127-pre | 1,314 | 7/19/2016 |
4.2.1126-pre | 1,317 | 7/19/2016 |
4.2.1125-pre | 1,320 | 7/19/2016 |
4.2.1123-pre | 1,301 | 7/19/2016 |
4.2.1119-pre | 1,298 | 7/18/2016 |
4.2.1113-pre | 1,306 | 7/16/2016 |
4.2.1108-pre | 1,369 | 7/15/2016 |
4.2.1107-pre | 1,346 | 7/15/2016 |