Azure SignalR Service now supports Event Grid!
Since we GA’ed Azure SignalR Service in last September, serverless has become a very popular use case in Azure SignalR Service and is used by many customers. Unlike the traditional SignalR application which requires a server to host the hub, in serverless scenario no server is needed, instead you can directly send messages to clients through REST APIs or our management SDK which can easily be used in serverless code like Azure Functions.
Though there is a huge benefit which saves you the cost of maintaining the app server, the feature set in serverless scenario is limited. Since there is no real hub, it’s not possible to respond to client activities like client invocations or connection events. Without client events serverless use cases will be limited and we hear a lot of customers asking about this support. Today we’re excited to announce a new feature that enables Azure SignalR Service to publish client events to Azure Event Grid so that you can subscribe and respond to them.
How does it work?
Let’s first revisit how serverless scenario in Azure SignalR Service works.
-
In serverless scenario, even you don’t have an app server, you still need to have a negotiate API so SignalR client can do the negotiation to get the url to SignalR service and a corresponding access token. Usually this can be done using an Azure Function.
-
Client will then use the url and access token to connect to SignalR service.
-
After clients are connected, you can send message to clients using REST APIs or service management SDK. If you are using Azure Functions, our SignalR Service binding does the work for you so you only need to return the messages as an output binding.
This flow is illustrated as step 1-3 in the diagram below:
What’s missing here is that there is no equivalent of OnConnected()
and OnDisconnected()
in serverless APIs so there is no way for the Azure function to know whether a client is connected or disconnected.
Now with Event Grid you’ll be able to get such events through an Event Grid subscription (as step 4 and 5 in the above diagram):
-
When a client is connected/disconnected to SignalR service, service will publish this event to Event Grid.
-
In Azure function you can have an Event Grid trigger and subscribe to such events, then Event Grid will send those events to the function (through a webhook).
How to use it?
It’s very simple to make your serverless application subscribe to SignalR connection events. Let’s use Azure function as an example.
-
First you need to make sure your SignalR Service instance is in serverless mode. (Create a SignalR Service instance if you haven’t done so.)
-
Create an Event Grid trigger in your function app.
-
In the Event Grid trigger, add an Event Grid subscription.
Then select your SignalR Service instance.
Now you’re all set! Your function app is now able to get connection events from SignalR Service.
To test it, you just need to open a SignalR connection to the service. You can use the SignalR client in our sample repo, which contains a simple negotiate API implementation.
-
Clone AzureSignalR-samples repo.
-
Start the sample negotiation server.
cd samples\Management\NegotiationServer set Azure__SignalR__ConnectionString=<connection_string> dotnet run
-
Run SignalR client.
cd samples\Management\SignalRClient dotnet run
Open the function logs in Azure portal and you’ll see a connected event is sent to the function:
If you stop the client you’ll also see a disconnected event is received.
Try it now!
This feature is now in public preview so feel free to try it out and let us know your feedback by filing issues on Github.
For more information about how to use Event Grid with SignalR Service, you can read this article or try this sample.
great blog!, but how the signal R service get the message from EventGrid, and send to client App? like your sample above, in the event grid function, how to pass the message to signal R service? thanks.
How do we handle pushing messages to SignalR from the Azure Function? Do we have to negotiate this manually? SignalR doesn’t show up on the list of Azure Function outputs, so there’s no easy way to integrate that I can see.
Why can’t these events be published via SignalR messages to all clients who subscribe to them?
Pardon my ignorance, but why couldn’t the SignalR service just publish events directly to the Azure Function?
With Event Grid you’ll be able to integrate SignalR events with more Azure services, like storage queue, service bus, etc. Azure function is just one of them.
this is cool. thx