Releases: centrifugal/centrifugo
v6.3.1
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, Server-Sent Events (SSE/EventSource), GRPC, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server.
Centrifugo is language-agnostic and can be used to build chat apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. in combination with any backend. It is well suited for modern architectures and allows decoupling the business logic from the real-time transport layer.
Several official client SDKs for browser and mobile development wrap the bidirectional protocol. In addition, Centrifugo supports a unidirectional approach for simple use cases with no SDK dependency.
For details, go to the Centrifugo documentation site.
What's changed
Fixes
- Fix v6.3.0 regression in bidirectional WebSocket frame ping/pong, see #1041
Miscellaneous
- This release is built with Go 1.24.7.
- Updated dependencies.
- See also the corresponding Centrifugo PRO release.
v6.3.0
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, Server-Sent Events (SSE/EventSource), GRPC, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server.
Centrifugo is language-agnostic and can be used to build chat apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. in combination with any backend. It is well suited for modern architectures and allows decoupling the business logic from the real-time transport layer.
Several official client SDKs for browser and mobile development wrap the bidirectional protocol. In addition, Centrifugo supports a unidirectional approach for simple use cases with no SDK dependency.
For details, go to the Centrifugo documentation site.
What's changed
See the Fixes
section for a breaking change in this release (flags vs env priority).
Improvements
- WebSocket frame ping-pong now inherits values from
client.ping_interval
andclient.pong_timeout
#1033. This applies to both bidirectional and unidirectional WebSocket transports. - Support for
cf_connect
in unidirectional WebSocket, similar to what Centrifugo provides for unidirectional SSE #1033. This allows connecting to the unidirectional WebSocket endpoint without requiring the client to send the first connect message to the server. See the updated docs. - Slightly faster unidirectional WebSocket connection establishment due to reduced allocations #1033.
- Extrapolate custom environment variables in
MapStringString
config fields #1034. This helps define secret map values in config via separate environment variables. See the updated docs for environment variables. - Centrifugo Helm chart is now published to GitHub Container Registry. See Centrifugo Packages. Contributed by @1995parham.
- Small improvement in the web UI to show milliseconds in request times sent from the Actions page.
Fixes
- Fix flags priority: flags must override environment variables #1029. This regression in Centrifugo v6 changes behavior, but it restores the documented behavior, matches previous versions, and is more natural for software. In general, this should not affect production setups, which rarely use command-line flags.
- Fix
none
log level by using the properzerolog
level #1027. Also warns if the configured log level is incorrect. - Fix missing WebTransport in usage stats #1028.
Miscellaneous
- This release is built with Go 1.24.6.
- Updated dependencies.
- See also the corresponding Centrifugo PRO release.
v6.2.5
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, Server-Sent Events (SSE/EventSource), GRPC, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server.
Centrifugo is language-agnostic and can be used to build chat apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. in combination with any backend. It is well suited for modern architectures and allows decoupling the business logic from the real-time transport layer.
Several official client SDKs for browser and mobile development wrap the bidirectional protocol. In addition, Centrifugo supports a unidirectional approach for simple use cases with no SDK dependency.
For details, go to the Centrifugo documentation site.
What's changed
Improvements
- Improved admin web UI:
- Refreshed login screen with bubbles instead of lines 🫧
- Sleek cards with totals on Status screen
- Total subscriptions counter added in addition to Total nodes running and Total clients
- Better response visualizations on Actions page to improve UX when the same response is returned
- Monaco JSON editor instead of Ace — lighter size and slightly more visually appealing
- Updated to React v19 and Material UI v7
- Introduce source code typo check in CI #1004
Fixes
- Fix existing typos in source code by @yinheli #1004
- Fixes in WebTransport: make it work with debug middleware, suppress errors in normal closure case #1021
- Fix flaky Kafka test #1026
Miscellaneous
- This release is built with Go 1.24.6.
- Updated dependencies.
- See also the corresponding Centrifugo PRO release.
v6.2.4
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, Server-Sent Events (SSE/EventSource), GRPC, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server.
Centrifugo is language-agnostic and can be used to build chat apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. in combination with any backend. It is well suited for modern architectures and allows decoupling the business logic from the real-time transport layer.
Several official client SDKs for browser and mobile development wrap the bidirectional protocol. In addition, Centrifugo supports a unidirectional approach for simple use cases with no SDK dependency.
For details, go to the Centrifugo documentation site.
What's changed
Improvements
- Added
has_recovered_publications
label (yes|no
) tocentrifugo_client_recover
counter metric to distinguish between recoveries that included recovered publications and those which did not (but still succeeded). - Boolean option
prometheus.recovered_publications_histogram
to enable recovered publications histogram #1017. The flag enables a histogram to track the distribution of recovered publications number in successful recoveries. This allows to visualize and evaluate the number of publications successfully recovered. The insight can help to fine-tune history settings. See in docs
Fixes
- Fix memory leak in Kafka backpressure mechanism #1018. Fixes regression introduced in Centrifugo v6.2.3. Due to the fact Centrifugo looked at number of items in the queue instead of the number of records, memory usage could grow significantly since consuming from partitions was not paused when required.
- Fix and improve redis mode logging #1010 - previously Centrifugo was setting up Redis mode correctly, but logged it wrong. Now it was fixed, and Centrifugo includes more details about Redis mode logging to see the configured setup properties.
- Fix duration overflow due to large
exp
in JWT tokens, max ttl 1 year for connection and subscription token refreshed centrifugal/centrifuge#495. The bug in settingexp
in JWT could result into Centrifugo timer logic failure (because Centrifuge hadDuration
type overflow, which is approximately 290 years). As a consequence - pings were never sent by Centrifugo. Added a reasonable protection from such cases.
Miscellaneous
- This release is built with Go 1.24.5.
- Updated dependencies.
- See also the corresponding Centrifugo PRO release.
v6.2.3
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, Server-Sent Events (SSE/EventSource), GRPC, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server.
Centrifugo is language-agnostic and can be used to build chat apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. in combination with any backend. It is well suited for modern architectures and allows decoupling the business logic from the real-time transport layer.
Several official client SDKs for browser and mobile development wrap the bidirectional protocol. In addition, Centrifugo supports a unidirectional approach for simple use cases with no SDK dependency.
For details, go to the Centrifugo documentation site.
What's changed
Improvements
- Use our internal fork of the Gorilla WebSocket library for unidirectional WebSocket transport, which provides slightly better Upgrade performance #1005. The fork was previously used only for bidirectional WebSocket transport.
- Kafka consumer: introduce a per-partition size-limited queue for backpressure and a configurable
fetch_max_wait
#997. Centrifugo now polls Kafka with500ms
by default and avoids using theSetOffsets
API of thefranz-go
library. Instead of a buffered channel, we now use a queue (limited by size, configured overpartition_queue_max_size
). Thepartition_buffer_size
(was not documented) option was removed since the internal consumer implementation changed, but we do not expect this to be a problem for users based on the added benchmark and improved throughput in the new implementation. However, it may result in a warning in logs about using the non-existingpartition_buffer_size
option, which may be an inconvenience. See updated docs. - Kafka consumer: switch to ReadCommitted mode for consuming by default, adding a boolean
fetch_read_uncommitted
option to consume with ReadUncommitted mode #1001. See updated docs.
Fixes
- Fix Kubernetes environment variable regex by @yinheli #1003 – in some cases, this allows avoiding extra warnings in logs about variables with the
CENTRIFUGO_
prefix automatically injected by the K8S runtime. - Fix panic when using the server
subscribe
API during Redis unavailability #centrifugal/centrifuge#491
Miscellaneous
- This release is built with Go 1.24.5.
- Updated dependencies.
- See also the corresponding Centrifugo PRO release.
v6.2.2
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, Server-Sent Events (SSE/EventSource), GRPC, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server.
Centrifugo is language-agnostic and can be used to build chat apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. in combination with any backend. It is well suited for modern architectures and allows decoupling the business logic from the real-time transport layer.
Several official client SDKs for browser and mobile development wrap the bidirectional protocol. In addition, Centrifugo supports a unidirectional approach for simple use cases with no SDK dependency.
For details, go to the Centrifugo documentation site.
What's changed
Improvements
- Option to use try lock for postgresql consumer, #988. New option for PG consumer
use_try_lock
(boolean, defaultfalse
) to usepg_try_advisory_xact_lock
instead ofpg_advisory_xact_lock
for locking outbox table. This may help to reduce the number of long-running transactions on PG side.
Fixes
- Fix log entries about engine on start #992.
Miscellaneous
- This release is built with Go 1.24.4.
- Updated dependencies.
- See also the corresponding Centrifugo PRO release.
v6.2.1
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, Server-Sent Events (SSE/EventSource), GRPC, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server.
Centrifugo is language-agnostic and can be used to build chat apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. in combination with any backend. It is well suited for modern architectures and allows decoupling the business logic from the real-time transport layer.
Several official client SDKs for browser and mobile development wrap the bidirectional protocol. In addition, Centrifugo supports a unidirectional approach for simple use cases with no SDK dependency.
For details, go to the Centrifugo documentation site.
What's changed
Improvements
- Minor tweaks in web UI: method select with quick search in Actions tab.
Miscellaneous
- This release is built with Go 1.24.3.
- Updated dependencies.
- See also the corresponding Centrifugo PRO release.
v6.2.0
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, Server-Sent Events (SSE/EventSource), GRPC, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server.
Centrifugo is language-agnostic and can be used to build chat apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. in combination with any backend. It is well suited for modern architectures and allows decoupling the business logic from the real-time transport layer.
Several official client SDKs for browser and mobile development wrap the bidirectional protocol. In addition, Centrifugo supports a unidirectional approach for simple use cases with no SDK dependency.
For details, go to the Centrifugo documentation site.
What's changed
Improvements
- Added five new built-in async consumers in #968. We believe having them in Centrifugo can drastically simplify introducing real-time messages in existing systems, built on modern cloud infrastructures. In addition to Kafka and PostgreSQL outbox table, Centrifugo now has consumers from the following popular messaging systems:
- Redis Stream, see integration docs
- Nats Jetstream, see integration docs
- Google Cloud PUB/SUB, see integration docs
- AWS SQS, see integration docs
- Azure Service Bus, see integration docs
- Currently, docs may lack some details but hopefully will be improved with time and feedback received. Please reach out in the community channels if you have any questions or suggestions. See also below a new blog post which demonstrates Redis Stream consumer usage.
- Skip unordered publications at the Broker level based on
version
andversion_epoch
fields #971. See updated publish and broadcast API docs. Note, this is mostly useful for a scenario, when each channel publication has the entire state instead of incremental updates – so skipping intermediate publications is safe and beneficial (especially given Centrifugo now has more built-in asynchronous consumers, and some of them can not provide ordered processing). - Added support for specifying the API command method in messages consumed by asynchronous consumers via a header, property, or attribute. When this is provided, the message payload must be a serialized API request object (as used in the server HTTP API). The exact mechanism is consumer-specific. For example, the Kafka consumer supports a
centrifugo-method
header, which can be set to values likepublish
,broadcast
, orsend_push_notification
(and so on), allowing the message payload to be a JSON API request. This approach improves decoding efficiency and may open a road for using binary encoded command requests in the future. - New configdoc CLI helper to display the full Centrifugo configuration as HTML or Markdown #959 — run
centrifugo configdoc
to see it in action. - Added support for tags in publications from the Nats broker #964.
- Handle optional
alg
field in JWKS #962, resolves #961. - Log whether FIPS mode is enabled during Centrifugo startup #975. See FIPS 140-3 Compliance document (part of Go 1.24 release).
- Performance: Removed allocation during WebSocket subprotocol selection upon Upgrade centrifugal/centrifuge#476.
- Performance: Slightly improving client queue processing by fetching messages in batch instead of one-by-one.
Fixes
- Fixed concurrent map iteration and write panic occurring during Redis issues centrifugal/centrifuge#473.
- Fixed unmarshalling of
duration
type from environment variable JSON #973. - Fixed an issue where
channel_replacements
were not applied when publishing to a channel via the Centrifugo API in NATS Raw Mode. See #977.
New tutorial in blog
To support the changes in this release, we published a new blog post: Building a real-time WebSocket leaderboard with Centrifugo and Redis.
In the tutorial, we create a real-time WebSocket leaderboard using Centrifugo, Redis, React and some Python. Showing the usage of Centrifugo built-in asynchronous consumer from Redis Stream and using version
/version_epoch
fields for dropping non-actual data on Centrifugo side. The post additionally showcases Centrifugo Fossil delta compression support and cache recovery mode.
Miscellaneous
- New animation on https://centrifugal.dev/ – with burstable bubbles upon click, your kids will love it 🙃
- Cleanup in
api.proto
— removed messages related to the legacy HTTP API. - This release is built with Go 1.24.2.
- See also the corresponding Centrifugo PRO release.
v6.1.0
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, Server-Sent Events (SSE/EventSource), GRPC, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server.
Centrifugo is language-agnostic and can be used to build chat apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. in combination with any backend. It is well suited for modern architectures and allows decoupling the business logic from the real-time transport layer.
Several official client SDKs for browser and mobile development wrap the bidirectional protocol. In addition, Centrifugo supports a unidirectional approach for simple use cases with no SDK dependency.
For details, go to the Centrifugo documentation site.
What's changed
Improvements
- Centrifugo now automatically detects Redis Cluster and no longer requires explicit Cluster configuration. See #951 for more background on this decision. TLDR: Modern cloud providers usually provide
redis://host:port
orrediss://host:port
URLs to users, which may correspond to either standalone Redis or Redis Cluster under the hood. Things should now work out of the box for Centrifugo users when using this string as the Redisaddress
, making Centrifugo more cloud-friendly. - Added support for the
rediss
scheme (enabling TLS). Previously, this was possible via settings likeengine.redis.tls.enabled=true
ortls_enabled=true
in the Redis URL. However,rediss://
is part of Redis specification and very common. See #951. - Centrifugo now uses Go 1.24.x (specifically 1.24.1 for this release), inheriting performance optimizations introduced in the latest Go version. If you follow our community channels, you may have seen that we tried Centrifugo's PUB/SUB throughput benchmark with Go 1.24 and observed nice improvements. The previous maximum throughput on an Apple M1 Pro (2021) was 1.62 million msgs/sec, which increased to 1.74 million msgs/sec with Go 1.24—without any code changes on our side.
- Centrifugo now adds the
Access-Control-Max-Age: 300
header for HTTP-based transport preflight responses and emulation endpoint preflight responses. This prevents browsers from sending preflight OPTIONS request before every POST request in cross-origin setups. As a result, bidirectional emulation in cross-origin environments is now more efficient, reducing latency for client-to-server emulation requests (since it requires 1 RTT instead of 2 RTTs) and reducing the number of HTTP requests. Note that you need to use the latestcentrifuge-js
(>=5.3.4) to benefit from this change. - Added a DEB package for Ubuntu 24.04 Noble Numbat. Removed support for Ubuntu Bionic Beaver due to its EOL. Addresses #946.
Fixes
- Downgraded the
rueidis
dependency to v1.0.53 to avoid AUTH errors when RESP2 is forced. See redis/rueidis#788.
Miscellaneous
- Centrifugo v6 has been recently released. See details in the Centrifugo v6 release blog post.
- This release is built with Go 1.24.1.
- See also the corresponding Centrifugo PRO release.
v6.0.3
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, SSE/EventSource, GRPC, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server.
Centrifugo is language-agnostic and can be used to build chat apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. in combination with any backend. It is well suited for modern architectures and allows decoupling the business logic from the real-time transport layer.
Several official client SDKs for browser and mobile development wrap the bidirectional protocol. In addition, Centrifugo supports a unidirectional approach for simple use cases with no SDK dependency.
For details, go to the Centrifugo documentation site.
What's changed
Improvements
- Added Valkey - https://valkey.io/ - to the Redis engine integration tests suite. This is becoming important as AWS moves Elasticache to Valkey under the hood.
- Optimizations for unidirectional transports #941
uni_sse
– now supports writing many messages to the underlying HTTP connection buffer beforeFlush
, thereby inheriting Centrifugo client protocol message batching capabilities. This may result into fewer syscalls => better CPU usage.uni_http_stream
– implements the same improvements asuni_sse
.uni_websocket
– new boolean option uni_websocket.join_push_messages. Once enabled, it allows Centrifugo to join unidirectional Push messages into a single websocket frame. It is a separate option foruni_websocket
because, in this case, the client side must be prepared to decode the frame into separate messages. The messages follow the Centrifugal client protocol format (for JSON – new-line delimited). Essentially, this mirrors the format used by Centrifugo for the bidirectional websocket.- Reduced allocations during the unidirectional connect stage by eliminating the intermediary
ConnectRequest
object.
- Optimizations for bidirectional emulation:
- The
http_stream
andsse
transports used in bidirectional emulation now benefit from the same improvements regarding connection buffer writes as described for unidirectional transports. - The
/emulation
endpoint now uses faster JSON decoder for incoming requests.
- The
- Improved documentation:
- Enhanced readability in the configuration docs – available options are now clearly visible.
- More detailed unidirectional protocol description.
- More structured descriptions for real-time transports with better options visibility.
Miscellaneous
- Centrifugo v6 has been recently released. See the details in the Centrifugo v6 release blog post.
- This release is built with Go 1.23.6.
- See also the corresponding Centrifugo PRO release.