-
Notifications
You must be signed in to change notification settings - Fork 7
Plugins
When we say "plugins", we are referring to the plugins IEventSink
and ISubscriptionStore
components you will want to have in your webhook implementation to complete it.
You will have to select and register at least one of each of these things for your webhooks to work end-to-end.
We are expecting everyone who uses the 'ServiceStack.Webhooks' framework to have different requirements for deploying their webhooks, and so everyone will require a variety of plugins to choose from.
This project, ServiceStack.Webhooks provides a few plugins that can be used right away without installing any other nuget packages. They are:
The built-in and default IEventSink
that delivers events to subscribers in-proc with the service that raised the event. Great for testing, crappy for production.
WARNING: If you don't register any other IEventSink
this one is used as the default.
WARNING: About the built-in AppHostEventSink is extremely limited in what it does. It runs in-proc with your service request pipeline and attempts to raise events to all subscribers on the same thread as the thread that raises the event from your service! That means that your service API call is going to sit there while events are delivered to every subscriber (across the network). This is great for functional testing, but rubbish in production environments. You absolutely need to swap it out for something that is far more scalable, reliable and performant.
The built-in and default ISubscriptionStore
that saves subscriptions in the memory of your service. Great for testing, crappy for production.
WARNING: If you don't register any other ISubscriptionStore
this one is used as the default.
WARNING: About the built-in MemorySubscriptionStore is extremely limited in what it does. It stores subscriber subscriptions in the memory of your service, which are all going to be lost whenever your AppHost restarts. Which is kind of rubbish in production environments. You will probably want to use something that has a little more persistence than that like a database or cache of some kind.
An ISubscriptionStore
that will use the currently registered ICacheClient
.
If you already have your own ICacheClient
registered in your AppHost and want to use that as your subscription store, you can simply just register the CacheClientSubscriptionStore
as your ISubscriptionStore
.
So for example, if you want to use Redis as your store, you could just do this:
container.Register<IRedisClientsManager>(c =>
new PooledRedisClientManager("localhost:6379"));
container.Register(c => c.Resolve<IRedisClientsManager>().GetCacheClient());
container.RegisterAutoWiredAs<CacheClientSubscriptionStore, ISubscriptionStore>();
Plugins.Add(new WebhookFeature());
WARNING: About the CacheClientSubscriptionStore is not that optimal as a store using the ICacheClient
interface. ICacheClient
forces us to use cache keys that enforce a linear index, that is not really optimal for the kinds of varied searches that ISubscriptionStore
demands. If you really want to create a more more optimal ISubscriptionStore
for your database/backend, you are better not to use the CacheClientSubscriptionStore
and write your own dedicated ISubscriptionStore
for your data specific store. Then of course share it on github for others to use. We will list it here or you.
These are the known additional 'Plugins' to the ServiceStack.Webhooks
framework:
(last updated of 11th March 2017)
This plugin includes an Azure table storage ISubscriptionStore
for storing subscriptions, and includes an Azure Queue IEventSink
and an Azure WorkerRole for delivering events to subscribers.
See Getting Started for more details.
This plugin provides an ISubscriptionStore
for OrmLite enabling the use of any OrmLite connected store.
To make use of OrmLiteSubscriptionStore you first need to install the OrmLite NuGet package of the RDBMS you wish to use then register the Dialect Provider and connection string you wish to use, e.g:
container.Register<IDbConnectionFactory>(c =>
new OrmLiteConnectionFactory(connectionString, SqlServer2012Dialect.Provider));
Which is used to register the OrmLiteSubscriptionStore:
container.Register<ISubscriptionStore>(c =>
new OrmLiteSubscriptionStore(c.Resolve<IDbConnectionFactory>()));
//Create WebhookSubscription and SubscriptionDeliveryResult tables if they don't exist
container.Resolve<ISubscriptionStore>().InitSchema();
If you don't see what you are looking for here, see the Building Your Own Plugin page for how to get what you need.
(Just don't forget to tell us here about it, so we can add it to this list).