Foundatio.RabbitMQ 10.7.1

前缀已保留
dotnet add package Foundatio.RabbitMQ --version 10.7.1                
NuGet\Install-Package Foundatio.RabbitMQ -Version 10.7.1                
该命令旨在在Visual Studio的包管理器控制台中使用,因为它使用NuGet模块的Install-Package版本。
<PackageReference Include="Foundatio.RabbitMQ" Version="10.7.1" />                
对于支持PackageReference的项目,请将此XML节点复制到项目文件以引用包。
paket add Foundatio.RabbitMQ --version 10.7.1                
#r "nuget: Foundatio.RabbitMQ, 10.7.1"                
#r指令可用于F# Interactive和Polyglot Notebooks。请将此内容复制到交互工具或脚本的源代码中,以引用包。
// 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                

FoundatioFoundatio

Build status NuGet Version feedz.io Discord

构建松散耦合分布式应用的插件式基础组件。

包括Redis、Azure、AWS、RabbitMQ、Kafka和内存中的实现(用于开发)。

为何选择Foundatio?

在构建几个大型云应用时,我们发现缺少优秀的解决方案(这并不是说没有解决方案),这些解决方案用于构建可扩展的分布式应用,同时保持开发体验简单。以下是构建和使用Foundatio的一些原因:

  • 想要使用抽象接口,这样我们可以轻松地更改实现。
  • 希望模块依赖注入友好。
  • 缓存:我们最初使用开源Redis缓存客户端,但后来它变成了一个具有高额许可费用的商业产品。不仅如此,还没有内存实现,因此每个开发者都需要设置和配置Redis。
  • 消息总线:最初我们考虑了NServiceBus(一款优秀的产品),但它有高昂的许可费用(他们也需要吃饭),而且不是开源友好型。我们也研究了MassTransit(另一款优秀的产品),但当时发现Azure支持不足,本地设置麻烦(对于内存中的)。我们想要一个简单易用的消息总线,能够在本地或云环境中运行。
  • 存储:我们没有找到任何现有项目,既是解耦的,又支持内存、文件存储或Azure Blob存储。

总结一下,如果您想轻松地进行开发和测试,同时允许您的应用进行扩展,请使用Foundatio!

实现

入门(开发)

通过NuGet包管理器可以安装Foundatio。如果您需要帮助,请打开一个问题或加入我们的Discord聊天室。如果您有任何问题,我们随时在此为您提供帮助!

本节仅用于开发目的!如果您正在尝试使用Foundatio库,请从NuGet获取。

  1. 您需要安装Visual Studio Code
  2. 打开Foundatio.sln Visual Studio解决方案文件。

使用Foundatio

下述章节仅包含了Foundatio功能的一小部分。我们建议您查看源代码以获取更多信息。如果您有任何问题或需要帮助,请告诉我们!

缓存

缓存允许您以闪电般的速度存储和访问数据,从而节省您创建或获取数据时所花费的昂贵操作。我们提供了四种不同的缓存实现,它们均继承自ICacheClient接口

  1. InMemoryCacheClient:一种内存中的缓存客户端实现。这种缓存实现只对进程的生存期有效。值得注意的是,内存中的缓存客户端可以通过MaxItems属性缓存最后X项。我们在Exceptionless中使用它来仅保持最后250个解析过的geoip结果
  2. HybridCacheClient:这种缓存实现同时使用ICacheClientInMemoryCacheClient,并使用IMessageBus来确保跨进程缓存同步。这可以带来巨大的性能提升,因为如果您要缓存的项存在于本地缓存中,则可以节省序列化操作和远程缓存的调用。
  3. RedisCacheClient:Redis缓存客户端实现。
  4. RedisHybridCacheClient:一个使用RedisCacheClient作为ICacheClient并使用RedisMessageBus作为IMessageBusHybridCacheClient实现。
  5. ScopedCacheClient:这种缓存实现使用ICacheClient的实例和一个字符串scope。范围将添加到每个缓存键之前。这使得对所有缓存键进行范围划分和轻松删除变得非常简单。
示例
using Foundatio.Caching;

ICacheClient cache = new InMemoryCacheClient();
await cache.SetAsync("test", 1);
var value = await cache.GetAsync<int>("test");

队列

队列提供先进先出(FIFO)消息传递。我们提供了四个不同的队列实现,这些实现源自于IQueue接口

  1. InMemoryQueue:内存队列实现。此队列实现仅对进程的生存期有效。
  2. RedisQueue:Redis队列实现。
  3. AzureServiceBusQueue:Azure Service Bus Queue实现。
  4. AzureStorageQueue:Azure Storage Queue实现。
  5. 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接口

  1. CacheLockProvider:一个使用缓存在进程之间进行通信的锁实现。
  2. ThrottlingLockProvider:一个仅允许一定数量的锁通过的锁实现。您可以将其用于限制对外部服务的API调用,并且它将跨所有请求该锁的进程进行限制。
  3. 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接口

  1. InMemoryMessageBus:内存消息总线实现。此消息总线实现仅对进程的生存期有效。
  2. RedisMessageBus:Redis消息总线实现。
  3. RabbitMQMessageBus:RabbitMQ实现。
  4. KafkaMessageBus:Kafka的实现。
  5. 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" });

作业

让您能够在不担心提前终止的情况下运行长时间运行的过程(进程内或进程外)。我们根据您的用例提供三种不同的定义任务的方式。

  1. 任务:所有任务都必须从以下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;
  1. 队列处理器任务:队列处理器任务非常适合用于从待处理数据驱动的任务。队列处理器任务必须从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;
  1. 工作项任务:工作项任务将在工作项池中与其它工作项任务一起运行。这类任务非常适合那些不太经常发生但应该作为任务来处理的事项(例如:删除拥有许多子项的实体)。当您在消息总线上发布消息时,它将被触发。任务必须从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接口

  1. InMemoryFileStorage:一个内存文件实现。这种文件存储实现仅在进程的生命周期内有效。
  2. FolderFileStorage:一个使用硬盘进行存储的文件存储实现。
  3. AzureFileStorage:一个Azure Blob存储实现。
  4. S3FileStorage:一个AWS S3文件存储实现。
  5. RedisFileStorage:一个Redis文件存储实现。
  6. MinioFileStorage:一个Minio文件存储实现。
  7. AliyunFileStorage:一个阿里云文件存储实现。
  8. SshNetFileStorage:一个SFTP文件存储实现。

我们建议将所有的 IFileStorage 实现作为单例使用。

示例
using Foundatio.Storage;

IFileStorage storage = new InMemoryFileStorage();
await storage.SaveFileAsync("test.txt", "test");
string content = await storage.GetFileContentsAsync("test.txt")

度量

我们提供了五个继承了IMetricsClient 接口的实现

  1. InMemoryMetricsClient:一个内存中的度量指标实现。
  2. RedisMetricsClient:一个Redis度量指标实现。
  3. StatsDMetricsClient:一个statsd度量指标实现。
  4. MetricsNETClient:一个Metrics.NET实现。
  5. AppMetricsClient:一个AppMetrics实现。
  6. CloudWatchMetricsClient:一个AWS CloudWatch实现。

我们建议将所有的 IMetricsClient 实现作为单例使用。

示例
IMetricsClient metrics = new InMemoryMetricsClient();
metrics.Counter("c1");
metrics.Gauge("g1", 2.534);
metrics.Timer("t1", 50788);

示例应用

我们有幻灯片和一个示例应用,展示了如何使用Foundatio。

感谢所有做出贡献的人

contributors

产品 兼容的和额外的计算目标框架版本。
.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已计算。
兼容的目标框架
包含的目标框架(在包中)
了解更多关于 目标框架.NET Standard 的信息。

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