In this blog post we will show an example of pub/sub messaging using open web services available in Eyevinn Open Source Cloud. Publish-subscribe messaging, or pub/sub messaging, is an asynchronous communication model that is central for a scalable and distributed system of modules or services.
Based on the open web service Valkey in Eyevinn Open Source Cloud we can build an application using the pub/sub messaging model.
In this guide
- Get an API Access Token and setup project
- Develop a subscriber example application
- Develop a publisher example application
Prerequisites
- An Eyevinn Open Source Cloud account.
Get an API Access Token and setup project
Navigate to Settings / API in the Eyevinn Open Source Cloud web console.
Copy this token and store in your shell's environment in the environment variable OSC_ACCESS_TOKEN
.
% export OSC_ACCESS_TOKEN=<access-token-copied-above>
Setup a NodeJS project.
% mkdir pubsub % cd pubsub % npm init
Install the Javascript client SDK.
% npm install --save @osaas/client-core @osaas/client-services
Subscriber application
We will start by developing the subscriber application that will register (subscribe) to topics of interest.
Create a file called subscriber.js
. Then add the following code to setup the Valkey instance that will be managing all topics and messages. Valkey is an open source, in-memory data store that is API compatible with a Redis client.
const { Context, getPortsForInstance } = require('@osaas/client-core'); const { createValkeyIoValkeyInstance, getValkeyIoValkeyInstance } = require('@osaas/client-services'); async function setup() { const ctx = new Context(); let valkey = await getValkeyIoValkeyInstance(ctx, 'example'); if (!valkey) { valkey = await createValkeyIoValkeyInstance(ctx, { name: 'example', Password: 'secret' }); } const token = await ctx.getServiceAccessToken('valkey-io-valkey'); const ports = await getPortsForInstance( ctx, 'valkey-io-valkey', 'example', token ); const port = ports.find((p) => p.internalPort === 6379); if (port) { return `redis://:${valkey.Password}@${port.externalIp}:${port.externalPort}`; } throw new Error('No redis port found'); }
The setup function will return a Redis URL to the Valkey instance.
Next step is to start waiting for messages and first we need to install a Redis client.
% npm install --save ioredis
We will add the following to the subscriber.js
file to subscribe on a topic called "messages".
const Redis = require('ioredis'); async function main() { const redisUrl = await setup(); const client = new Redis(redisUrl); try { await client.subscribe('messages'); console.log('Waiting for messages...'); client.on('message', (channel, message) => { console.log(`Received message: ${message} from ${channel}`); }); } catch (err) { console.error('Error:', err); } } main();
Now running this application we will get.
% node subscriber.js Waiting for messages...
Publisher application
Now open a new terminal and create a file called publisher.js
. Copy the setup function we created in the subscriber application and in addition add the following to this file.
async function publishMessage(topic, message) { const redisUrl = await setup(); const redisClient = new Redis(redisUrl); try { const receivedCount = await redisClient.publish(topic, message); console.log( `Message "${message}" published to channel "${topic}". Received by ${receivedCount} subscribers.` ); } catch (err) { console.error('Error publishing message', err); } finally { await redisClient.quit(); } } if (!process.argv[2]) { console.error('Please a message to publish'); process.exit(1); } publishMessage('messages', process.argv[2]);
Now run the publisher application and publish a Hello world message.
% node publisher.js "Hello world" Message "Hello world" published to channel "messages". Received by 1 subscribers.
And we will see that the subscriber application will output the message.
Waiting for messages... Received message: Hello world from messages
Conclusion
You have now successfully created a pub/sub messaging application using the open source Valkey in-memory data store for the messaging. With Valkey as an open web service in Eyevinn Open Source Cloud you could immediately start building your pub/sub messaging application without having to host the Valkey instance yourself. You also avoided to be locked in with a specific cloud vendor as it is based on open source.
Top comments (0)