如何使用ServiceStack重新定位Redis和RabbitMQ的现有实例

时间:2014-12-20 22:49:17

标签: servicestack

在成功开发具有多个ServiceStack服务的应用程序之后,我们正在转向其他测试环境,其中很多是由于我们运行SAAS模型(也称为多租户)。我想在一些这样的环境中重用一些基础架构服务,主要是Redis和RabbitMQ。

我们正在使用IAppSetting接口在运行时将我们的配置从多个源拉到一个内聚设置对象,然后是过滤层。由于层驱动每个环境的配置,因此使用Tier为任何RabbitMQ消息队列添加前缀是有意义的,并为Redis将使用的任何生成的缓存键添加前缀,从而为每个环境提供冲突保护。

以下是一个例子:

RabbitMQ => “这里有一些MQ方法”=> “的 MQ:qa1.Outbound.inq

Redis => “这里有一些Redis方法”=> “的瓮:qa1.somePoco:123

以下是配置示例和各种环境

<appSettings>
    <add key="Tier" value="qa1" />
    <!--<add key="Tier" value="dev" />-->
    <!--<add key="Tier" value="tst" />-->
    <!--<add key="Tier" value="stg" />-->
    <!--<add key="Tier" value="prod" />-->
</appSettings>

谢谢你, 斯蒂芬

1 个答案:

答案 0 :(得分:2)

有关如何修改队列名称的一些示例位于MqNameTests中,例如:

QueueNames.SetQueuePrefix("site1.");

将在QueueNames上添加前缀,例如:

site1.mq:TestPrefix.inq

否则,您可以使用QueueNames.ResolveQueueNameFn完全控制MQ名称,例如:

QueueNames.ResolveQueueNameFn = (typeName, suffix) =>
    "SITE.{0}{1}".Fmt(typeName, suffix.ToUpper());


QueueNames<TestFilter>.In.Print(); // SITE.TestFilter.INQ

请注意,同样的配置也需要在客户端上应用,因此使用相同的MQ名称。

使用AppSettings配置ServiceStack

ServiceStack是一个代码优先的框架,这意味着所有配置都是在代码中完成的,但有一个rich and versatile configuration model,您可以通过阅读AppHost.Configure()中的应用设置来获取您的行为:

QueueNames.SetQueuePrefix(AppSettings.Get("Tier","dev"));

如果您的Web.config中不存在Tier(例如在单元测试中),它将使用 dev ,否则将使用appSettings中的值:

<appSettings>
    <add key="Tier" value="qa1" />
</appSettings>