Releasing the new event type in Pusher Channels: Subscription Count event! This type of event automatically provides the number of connections currently subscribed to any given channel.
Presence at scale is tricky.
Today we’re releasing a new event type in Pusher Channels: subscription counting events. subscription_count
events automatically provide the number of connections currently subscribed to any given channel, allowing you to implement presence at scale.
Presence channels have always provided awareness of who is subscribed to a channel in a Pusher app. That particular piece of information makes it easy to build “who’s online” style functionality: chat rooms, teams collaborating in real time on a document, audiences in a live video stream, users viewing the same web page, players within an online game, etc.
But what if you’re looking at hundreds or thousands of users? We limit Presence channels to a maximum of 100 members. This is because the number of presence messages distributed grows exponentially with the number of people present in the channel which can cause a real headache and eat away at your message limit pretty fast.
Simply put, the vanilla presence channel use case doesn’t suit big numbers, so we’ve built subscription counts to serve large-scale presence.
A subscription_count
is an event that can be manually enabled to count the number of connections that are currently subscribed to a particular channel. They work with all channel types, except presence channels.
subscription_count
is useful for scenarios where you want to provide a live connection number at a large scale, and aren’t necessarily interested in who is present, joining, or leaving (which is the main use case for presence).
Previously, you would need to query the number of connections to a channel, before pushing this information to the channel to make it available to the clients.
Channels using these events aren’t held to the same limitations as presence channels, so you can show a realtime count of thousands of live users in your app. You might want to use subscription count to show:
subscription_count
works with all channel types except Presence channels. You can turn on this feature directly in the Channels dashboard. Enable the event toggle and Pusher will publish a subscription_count
event whenever the number of subscribers on a given channel changes.
channel.bind("pusher:subscription_count", (data) => {
console.log(data.subscription_count);
console.log(channel.subscription_count);
});
As soon as a user subscribes to a channel, a pusher_internal event is triggered with the name subscription_count
containing the number of subscribers currently present in the channel.
If the number of subscribers in the channel is fewer than or equal to 100, the client will receive updated counts every time someone subscribes or unsubscribes to a channel. When the channel grows to more than 100 subscribers, the client will receive an updated count of the last 30 seconds in a single event. This protects your message count from taking a hit based on high activity.
We maintain these counts for every cluster. With multiple instances of Pusher running on each cluster, there is a global count for a channel and a local count per instance. Instances update the counts in an atomic operation after every successful subscribe and unsubscribe event.
Maintaining the counts protects user experience. In the case that an instance goes down and subscribers from that instance were lost, a cleanup script will decrease the last known count from the global count.
To understand this, let’s first talk about how we are sending out these events.
We have divided the event emission into two parts:
For small groups, we publish the new count with every subscription/unsubscription. For a large group, since there’s a lot of activity, we bundle these events in a window of 30 seconds and send a single event for that window.
Pusher categorizes Presence channels as small groups. For such channels, we already broadcast member_added
and member_removed
, making subscription count irrelevant for this particular type of channel. So to save on message quota for the app, we have disabled the subscription count on Presence channels.
Here’s an example for a company chat app. Chat users always want to know how many people are currently online.
IMPORTANT:
To use the feature, you’ll need to enable both subscription counting and subscription count events.
For this example, we’ve used a public channel.
let pusher = new Pusher('', {
cluster: '<region>',
});
let channel = pusher.subscribe('my-channel');
channel.bind('pusher:subscription_count', (data) => {
console.log(data.subscription_count);
});
Ready to start implementing presence features for your realtime apps? Sign in to the Pusher dashboard or create a free sandbox account to start experimenting.