From 0f47d4923075bd32bce6b2ebf58887786b41cc3b Mon Sep 17 00:00:00 2001 From: Alexander Emelin Date: Mon, 18 Mar 2024 08:37:59 +0200 Subject: [PATCH] Deploy website - based on bb8630a9aa6f2934b5ceaae8a18c7a974d94bb38 --- 404.html | 4 +- ...80b57.dd81be33.js => 02080b57.ba223a6f.js} | 2 +- assets/js/059c3f88.711da6fc.js | 1 + assets/js/0d1e4c44.eff4b587.js | 1 + assets/js/29b4017f.58f99fc7.js | 1 + ...8e650.4da80a6b.js => 5f78e650.250c7a0e.js} | 2 +- assets/js/6aa24bd3.db8303bc.js | 1 + assets/js/8c2b6c10.688259ff.js | 1 + assets/js/a7023ddc.35936b43.js | 1 + assets/js/a7023ddc.c10c4b80.js | 1 - ...c169e.d3096993.js => ad7c169e.fb3a2ab2.js} | 2 +- assets/js/b05011d9.6022f39f.js | 1 + assets/js/b05011d9.6e8f50f2.js | 1 - ...675dd.6b2ce39c.js => b2b675dd.2e41a896.js} | 2 +- assets/js/b2f554cd.10e933e7.js | 1 - assets/js/b2f554cd.7c62f242.js | 1 + ...49370.59cb558a.js => ccc49370.faa06225.js} | 2 +- assets/js/db98acba.111f8834.js | 1 + assets/js/main.72a8d166.js | 2 + ...CENSE.txt => main.72a8d166.js.LICENSE.txt} | 0 assets/js/main.f6c58040.js | 2 - assets/js/runtime~main.50790586.js | 1 + assets/js/runtime~main.564eb97e.js | 1 - blog.html | 6 +- .../million-connections-with-centrifugo.html | 4 +- .../16/experimenting-with-quic-transport.html | 4 +- blog/2020/11/12/scaling-websocket.html | 4 +- blog/2021/01/15/centrifuge-intro.html | 4 +- blog/2021/08/31/hello-centrifugo-v3.html | 4 +- blog/2021/10/18/integrating-with-nodejs.html | 4 +- ...with-django-building-chat-application.html | 4 +- .../14/laravel-multi-room-chat-tutorial.html | 4 +- blog/2022/07/19/centrifugo-v4-released.html | 4 +- blog/2022/07/29/101-way-to-subscribe.html | 4 +- .../improving-redis-engine-performance.html | 4 +- blog/2023/03/31/keycloak-sso-centrifugo.html | 4 +- blog/2023/06/29/centrifugo-v5-released.html | 4 +- ...-streaming-to-centrifugo-with-benthos.html | 4 +- .../08/29/using-centrifugo-in-rabbitx.html | 4 +- ...ing-centrifugo-pro-push-notifications.html | 6 +- ...-with-websocket-to-grpc-subscriptions.html | 77 ++++++++++++++++++ blog/archive.html | 6 +- blog/atom.xml | 69 +++++++++++++++- blog/feed.json | 16 ++++ blog/rss.xml | 66 ++++++++++++++- blog/tags.html | 6 +- blog/tags/authentication.html | 4 +- blog/tags/benthos.html | 4 +- blog/tags/centrifuge.html | 4 +- blog/tags/centrifugo.html | 8 +- blog/tags/django.html | 4 +- blog/tags/go.html | 4 +- blog/tags/grpc.html | 24 ++++++ blog/tags/interview.html | 4 +- blog/tags/keycloak.html | 4 +- blog/tags/laravel.html | 4 +- blog/tags/loki.html | 24 ++++++ blog/tags/php.html | 4 +- blog/tags/pro.html | 4 +- blog/tags/proxy.html | 4 +- blog/tags/push-notifications.html | 4 +- blog/tags/quic.html | 4 +- blog/tags/redis.html | 4 +- blog/tags/release.html | 4 +- blog/tags/sso.html | 4 +- blog/tags/tutorial.html | 4 +- blog/tags/usecase.html | 4 +- blog/tags/websocket.html | 4 +- blog/tags/webtransport.html | 4 +- components/Highlight.html | 4 +- components/logo.html | 4 +- components/logos/Badoo.html | 4 +- components/logos/Grafana.html | 4 +- components/logos/ManyChat.html | 4 +- components/logos/OpenWeb.html | 4 +- docs/3/attributions.html | 4 +- docs/3/ecosystem/centrifuge.html | 4 +- docs/3/ecosystem/integrations.html | 4 +- docs/3/faq.html | 4 +- docs/3/flow_diagrams.html | 4 +- docs/3/getting-started/client_api.html | 4 +- docs/3/getting-started/design.html | 4 +- docs/3/getting-started/highlights.html | 4 +- docs/3/getting-started/installation.html | 4 +- docs/3/getting-started/integration.html | 4 +- docs/3/getting-started/introduction.html | 4 +- docs/3/getting-started/migration_v3.html | 4 +- docs/3/getting-started/quickstart.html | 4 +- docs/3/pro/analytics.html | 4 +- docs/3/pro/db_namespaces.html | 4 +- docs/3/pro/install_and_run.html | 4 +- docs/3/pro/overview.html | 4 +- docs/3/pro/performance.html | 4 +- docs/3/pro/process_stats.html | 4 +- docs/3/pro/singleflight.html | 4 +- docs/3/pro/throttling.html | 4 +- docs/3/pro/token_revocation.html | 4 +- docs/3/pro/tracing.html | 4 +- docs/3/pro/user_block.html | 4 +- docs/3/pro/user_connections.html | 4 +- docs/3/pro/user_status.html | 4 +- docs/3/server/admin_web.html | 4 +- docs/3/server/authentication.html | 4 +- docs/3/server/channels.html | 4 +- docs/3/server/codes.html | 4 +- docs/3/server/configuration.html | 4 +- docs/3/server/console_commands.html | 4 +- docs/3/server/engines.html | 4 +- docs/3/server/history_and_recovery.html | 4 +- docs/3/server/infra_tuning.html | 4 +- docs/3/server/load_balancing.html | 4 +- docs/3/server/monitoring.html | 4 +- docs/3/server/private_channels.html | 4 +- docs/3/server/proxy.html | 4 +- docs/3/server/server_api.html | 4 +- docs/3/server/server_subs.html | 4 +- docs/3/server/tls.html | 4 +- docs/3/transports/client_protocol.html | 4 +- docs/3/transports/client_sdk.html | 4 +- docs/3/transports/overview.html | 4 +- docs/3/transports/sockjs.html | 4 +- docs/3/transports/uni_grpc.html | 4 +- docs/3/transports/uni_http_stream.html | 4 +- docs/3/transports/uni_sse.html | 4 +- docs/3/transports/uni_websocket.html | 4 +- docs/3/transports/websocket.html | 4 +- docs/4/attributions.html | 4 +- docs/4/faq.html | 4 +- docs/4/flow_diagrams.html | 4 +- docs/4/getting-started/client_api.html | 4 +- docs/4/getting-started/community.html | 4 +- docs/4/getting-started/design.html | 4 +- docs/4/getting-started/ecosystem.html | 4 +- docs/4/getting-started/highlights.html | 4 +- docs/4/getting-started/installation.html | 4 +- docs/4/getting-started/integration.html | 4 +- docs/4/getting-started/introduction.html | 4 +- docs/4/getting-started/migration_v4.html | 4 +- docs/4/getting-started/quickstart.html | 4 +- docs/4/pro/analytics.html | 4 +- docs/4/pro/capabilities.html | 4 +- docs/4/pro/cel_expressions.html | 4 +- docs/4/pro/channel_patterns.html | 4 +- docs/4/pro/client_message_batching.html | 4 +- docs/4/pro/connections.html | 4 +- docs/4/pro/install_and_run.html | 4 +- docs/4/pro/overview.html | 4 +- docs/4/pro/performance.html | 4 +- docs/4/pro/process_stats.html | 4 +- docs/4/pro/push_notifications.html | 4 +- docs/4/pro/singleflight.html | 4 +- docs/4/pro/throttling.html | 4 +- docs/4/pro/token_revocation.html | 4 +- docs/4/pro/tracing.html | 4 +- docs/4/pro/user_block.html | 4 +- docs/4/pro/user_status.html | 4 +- docs/4/server/admin_web.html | 4 +- docs/4/server/authentication.html | 4 +- docs/4/server/channel_permissions.html | 4 +- docs/4/server/channel_token_auth.html | 4 +- docs/4/server/channels.html | 4 +- docs/4/server/codes.html | 4 +- docs/4/server/configuration.html | 4 +- docs/4/server/console_commands.html | 4 +- docs/4/server/engines.html | 4 +- docs/4/server/history_and_recovery.html | 4 +- docs/4/server/infra_tuning.html | 4 +- docs/4/server/load_balancing.html | 4 +- docs/4/server/monitoring.html | 4 +- docs/4/server/presence.html | 4 +- docs/4/server/proxy.html | 4 +- docs/4/server/server_api.html | 4 +- docs/4/server/server_subs.html | 4 +- docs/4/server/tls.html | 4 +- docs/4/transports/client_api.html | 4 +- docs/4/transports/client_protocol.html | 4 +- docs/4/transports/client_sdk.html | 4 +- docs/4/transports/http_stream.html | 4 +- docs/4/transports/overview.html | 4 +- docs/4/transports/sockjs.html | 4 +- docs/4/transports/sse.html | 4 +- docs/4/transports/uni_grpc.html | 4 +- docs/4/transports/uni_http_stream.html | 4 +- docs/4/transports/uni_sse.html | 4 +- docs/4/transports/uni_websocket.html | 4 +- docs/4/transports/websocket.html | 4 +- docs/4/transports/webtransport.html | 4 +- docs/attributions.html | 4 +- docs/faq.html | 4 +- docs/flow_diagrams.html | 4 +- docs/getting-started/community.html | 4 +- docs/getting-started/comparisons.html | 4 +- docs/getting-started/design.html | 4 +- docs/getting-started/ecosystem.html | 4 +- docs/getting-started/highlights.html | 4 +- docs/getting-started/installation.html | 4 +- docs/getting-started/integration.html | 4 +- docs/getting-started/introduction.html | 4 +- docs/getting-started/migration_v4.html | 4 +- docs/getting-started/migration_v5.html | 4 +- docs/getting-started/quickstart.html | 4 +- docs/pro/admin_idp_auth.html | 4 +- docs/pro/analytics.html | 4 +- docs/pro/capabilities.html | 4 +- docs/pro/cel_expressions.html | 4 +- docs/pro/channel_patterns.html | 4 +- docs/pro/channel_state_events.html | 4 +- docs/pro/client_message_batching.html | 4 +- docs/pro/connections.html | 4 +- docs/pro/distributed_rate_limit.html | 4 +- docs/pro/install_and_run.html | 4 +- docs/pro/observability_enhancements.html | 4 +- docs/pro/overview.html | 4 +- docs/pro/performance.html | 4 +- docs/pro/process_stats.html | 4 +- docs/pro/push_notifications.html | 4 +- docs/pro/rate_limiting.html | 4 +- docs/pro/singleflight.html | 4 +- docs/pro/token_revocation.html | 4 +- docs/pro/tracing.html | 4 +- docs/pro/user_block.html | 4 +- docs/pro/user_status.html | 4 +- docs/server/admin_web.html | 4 +- docs/server/authentication.html | 4 +- docs/server/channel_permissions.html | 4 +- docs/server/channel_token_auth.html | 4 +- docs/server/channels.html | 4 +- docs/server/codes.html | 4 +- docs/server/configuration.html | 4 +- docs/server/console_commands.html | 4 +- docs/server/consumers.html | 4 +- docs/server/engines.html | 4 +- docs/server/history_and_recovery.html | 4 +- docs/server/infra_tuning.html | 4 +- docs/server/load_balancing.html | 4 +- docs/server/monitoring.html | 4 +- docs/server/observability.html | 4 +- docs/server/presence.html | 4 +- docs/server/proxy.html | 4 +- docs/server/proxy_streams.html | 4 +- docs/server/server_api.html | 4 +- docs/server/server_subs.html | 4 +- docs/server/tls.html | 4 +- docs/transports/client_api.html | 4 +- docs/transports/client_protocol.html | 4 +- docs/transports/client_sdk.html | 4 +- docs/transports/http_stream.html | 4 +- docs/transports/overview.html | 4 +- docs/transports/sockjs.html | 4 +- docs/transports/sse.html | 4 +- docs/transports/uni_client_protocol.html | 4 +- docs/transports/uni_grpc.html | 4 +- docs/transports/uni_http_stream.html | 4 +- docs/transports/uni_sse.html | 4 +- docs/transports/uni_websocket.html | 4 +- docs/transports/websocket.html | 4 +- docs/transports/webtransport.html | 4 +- docs/tutorial/backend.html | 4 +- docs/tutorial/centrifugo.html | 4 +- docs/tutorial/frontend.html | 4 +- docs/tutorial/improvements.html | 4 +- docs/tutorial/intro.html | 4 +- docs/tutorial/layout.html | 4 +- docs/tutorial/outbox_cdc.html | 4 +- docs/tutorial/outro.html | 4 +- docs/tutorial/recovery.html | 4 +- docs/tutorial/reverse_proxy.html | 4 +- docs/tutorial/scale.html | 4 +- docs/tutorial/tips_and_tricks.html | 4 +- img/centrifugo_loki.jpg | Bin 0 -> 93763 bytes img/loki.mp4 | Bin 0 -> 323941 bytes index.html | 4 +- license.html | 4 +- license_exchange_lemon.html | 4 +- search.html | 4 +- sitemap.xml | 2 +- 276 files changed, 788 insertions(+), 510 deletions(-) rename assets/js/{02080b57.dd81be33.js => 02080b57.ba223a6f.js} (78%) create mode 100644 assets/js/059c3f88.711da6fc.js create mode 100644 assets/js/0d1e4c44.eff4b587.js create mode 100644 assets/js/29b4017f.58f99fc7.js rename assets/js/{5f78e650.4da80a6b.js => 5f78e650.250c7a0e.js} (76%) create mode 100644 assets/js/6aa24bd3.db8303bc.js create mode 100644 assets/js/8c2b6c10.688259ff.js create mode 100644 assets/js/a7023ddc.35936b43.js delete mode 100644 assets/js/a7023ddc.c10c4b80.js rename assets/js/{ad7c169e.d3096993.js => ad7c169e.fb3a2ab2.js} (54%) create mode 100644 assets/js/b05011d9.6022f39f.js delete mode 100644 assets/js/b05011d9.6e8f50f2.js rename assets/js/{b2b675dd.6b2ce39c.js => b2b675dd.2e41a896.js} (77%) delete mode 100644 assets/js/b2f554cd.10e933e7.js create mode 100644 assets/js/b2f554cd.7c62f242.js rename assets/js/{ccc49370.59cb558a.js => ccc49370.faa06225.js} (99%) create mode 100644 assets/js/db98acba.111f8834.js create mode 100644 assets/js/main.72a8d166.js rename assets/js/{main.f6c58040.js.LICENSE.txt => main.72a8d166.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.f6c58040.js create mode 100644 assets/js/runtime~main.50790586.js delete mode 100644 assets/js/runtime~main.564eb97e.js create mode 100644 blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions.html create mode 100644 blog/tags/grpc.html create mode 100644 blog/tags/loki.html create mode 100644 img/centrifugo_loki.jpg create mode 100644 img/loki.mp4 diff --git a/404.html b/404.html index a220b07f3..ff390379c 100644 --- a/404.html +++ b/404.html @@ -15,8 +15,8 @@ - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

diff --git a/assets/js/02080b57.dd81be33.js b/assets/js/02080b57.ba223a6f.js similarity index 78% rename from assets/js/02080b57.dd81be33.js rename to assets/js/02080b57.ba223a6f.js index c631c3abf..7f6013383 100644 --- a/assets/js/02080b57.dd81be33.js +++ b/assets/js/02080b57.ba223a6f.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcentrifugal_dev=self.webpackChunkcentrifugal_dev||[]).push([[9040],{94569:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/centrifugo","page":1,"postsPerPage":30,"totalPages":1,"totalCount":12,"blogDescription":"Centrifugal Blog","blogTitle":"Centrifugal Blog"}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcentrifugal_dev=self.webpackChunkcentrifugal_dev||[]).push([[9040],{94569:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/centrifugo","page":1,"postsPerPage":30,"totalPages":1,"totalCount":13,"blogDescription":"Centrifugal Blog","blogTitle":"Centrifugal Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/059c3f88.711da6fc.js b/assets/js/059c3f88.711da6fc.js new file mode 100644 index 000000000..cbce43603 --- /dev/null +++ b/assets/js/059c3f88.711da6fc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcentrifugal_dev=self.webpackChunkcentrifugal_dev||[]).push([[2750],{90671:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/grpc","page":1,"postsPerPage":30,"totalPages":1,"totalCount":1,"blogDescription":"Centrifugal Blog","blogTitle":"Centrifugal Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/0d1e4c44.eff4b587.js b/assets/js/0d1e4c44.eff4b587.js new file mode 100644 index 000000000..898e77153 --- /dev/null +++ b/assets/js/0d1e4c44.eff4b587.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcentrifugal_dev=self.webpackChunkcentrifugal_dev||[]).push([[5104],{73669:e=>{e.exports=JSON.parse('{"permalink":"/blog/tags/loki","page":1,"postsPerPage":30,"totalPages":1,"totalCount":1,"blogDescription":"Centrifugal Blog","blogTitle":"Centrifugal Blog"}')}}]); \ No newline at end of file diff --git a/assets/js/29b4017f.58f99fc7.js b/assets/js/29b4017f.58f99fc7.js new file mode 100644 index 000000000..d7656919d --- /dev/null +++ b/assets/js/29b4017f.58f99fc7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcentrifugal_dev=self.webpackChunkcentrifugal_dev||[]).push([[5993],{33416:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>n,default:()=>c,frontMatter:()=>s,metadata:()=>a,toc:()=>u});var o=i(85893),r=i(11151);const s={title:"Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions",tags:["centrifugo","loki","grpc"],description:"Centrifugo has GRPC subscription streams feature, in this post we show how this feature may simplify a task of delivering data to application UI in real-time. We integrate with Loki, injest log entries and stream logs to the browser based on user-supplied query",author:"Alexander Emelin",authorTitle:"Founder of Centrifugal Labs",authorImageURL:"/img/alexander_emelin.jpeg",image:"/img/centrifugo_loki.jpg",hide_table_of_contents:!1},n=void 0,a={permalink:"/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions",editUrl:"https://github.com/centrifugal/centrifugal.dev/edit/main/blog/2024-03-18-stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions.md",source:"@site/blog/2024-03-18-stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions.md",title:"Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions",description:"Centrifugo has GRPC subscription streams feature, in this post we show how this feature may simplify a task of delivering data to application UI in real-time. We integrate with Loki, injest log entries and stream logs to the browser based on user-supplied query",date:"2024-03-18T00:00:00.000Z",formattedDate:"March 18, 2024",tags:[{label:"centrifugo",permalink:"/blog/tags/centrifugo"},{label:"loki",permalink:"/blog/tags/loki"},{label:"grpc",permalink:"/blog/tags/grpc"}],readingTime:7.68,hasTruncateMarker:!0,authors:[{name:"Alexander Emelin",title:"Founder of Centrifugal Labs",imageURL:"/img/alexander_emelin.jpeg"}],frontMatter:{title:"Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions",tags:["centrifugo","loki","grpc"],description:"Centrifugo has GRPC subscription streams feature, in this post we show how this feature may simplify a task of delivering data to application UI in real-time. We integrate with Loki, injest log entries and stream logs to the browser based on user-supplied query",author:"Alexander Emelin",authorTitle:"Founder of Centrifugal Labs",authorImageURL:"/img/alexander_emelin.jpeg",image:"/img/centrifugo_loki.jpg",hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Discovering Centrifugo PRO: push notifications API",permalink:"/blog/2023/10/29/discovering-centrifugo-pro-push-notifications"}},l={authorsImageUrls:[void 0]},u=[];function g(e){const t={p:"p",...(0,r.a)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("img",{src:"/img/centrifugo_loki.jpg"}),"\n",(0,o.jsx)(t.p,{children:"As of version 5.1.0, Centrifugo introduces an experimental yet powerful extension that promises to simplify the data delivery process to the browser using GRPC streams. We believe it may help you to solve some practical tasks in minutes. Let's dive into how this feature works and how you can leverage it in your applications integrating with Loki real-time log streaming capabilities."})]})}function c(e={}){const{wrapper:t}={...(0,r.a)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(g,{...e})}):g(e)}},11151:(e,t,i)=>{i.d(t,{Z:()=>a,a:()=>n});var o=i(67294);const r={},s=o.createContext(r);function n(e){const t=o.useContext(s);return o.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:n(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5f78e650.4da80a6b.js b/assets/js/5f78e650.250c7a0e.js similarity index 76% rename from assets/js/5f78e650.4da80a6b.js rename to assets/js/5f78e650.250c7a0e.js index bdf87dbe9..0890496cd 100644 --- a/assets/js/5f78e650.4da80a6b.js +++ b/assets/js/5f78e650.250c7a0e.js @@ -1 +1 @@ -"use strict";(self.webpackChunkcentrifugal_dev=self.webpackChunkcentrifugal_dev||[]).push([[6979],{74300:e=>{e.exports=JSON.parse('{"label":"centrifugo","permalink":"/blog/tags/centrifugo","allTagsPath":"/blog/tags","count":12,"unlisted":false}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkcentrifugal_dev=self.webpackChunkcentrifugal_dev||[]).push([[6979],{74300:e=>{e.exports=JSON.parse('{"label":"centrifugo","permalink":"/blog/tags/centrifugo","allTagsPath":"/blog/tags","count":13,"unlisted":false}')}}]); \ No newline at end of file diff --git a/assets/js/6aa24bd3.db8303bc.js b/assets/js/6aa24bd3.db8303bc.js new file mode 100644 index 000000000..b5bc047d7 --- /dev/null +++ b/assets/js/6aa24bd3.db8303bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkcentrifugal_dev=self.webpackChunkcentrifugal_dev||[]).push([[6103],{19203:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>a,toc:()=>c});var r=n(85893),i=n(11151);const o={title:"Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions",tags:["centrifugo","loki","grpc"],description:"Centrifugo has GRPC subscription streams feature, in this post we show how this feature may simplify a task of delivering data to application UI in real-time. We integrate with Loki, injest log entries and stream logs to the browser based on user-supplied query",author:"Alexander Emelin",authorTitle:"Founder of Centrifugal Labs",authorImageURL:"/img/alexander_emelin.jpeg",image:"/img/centrifugo_loki.jpg",hide_table_of_contents:!1},s=void 0,a={permalink:"/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions",editUrl:"https://github.com/centrifugal/centrifugal.dev/edit/main/blog/2024-03-18-stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions.md",source:"@site/blog/2024-03-18-stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions.md",title:"Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions",description:"Centrifugo has GRPC subscription streams feature, in this post we show how this feature may simplify a task of delivering data to application UI in real-time. We integrate with Loki, injest log entries and stream logs to the browser based on user-supplied query",date:"2024-03-18T00:00:00.000Z",formattedDate:"March 18, 2024",tags:[{label:"centrifugo",permalink:"/blog/tags/centrifugo"},{label:"loki",permalink:"/blog/tags/loki"},{label:"grpc",permalink:"/blog/tags/grpc"}],readingTime:7.68,hasTruncateMarker:!0,authors:[{name:"Alexander Emelin",title:"Founder of Centrifugal Labs",imageURL:"/img/alexander_emelin.jpeg"}],frontMatter:{title:"Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions",tags:["centrifugo","loki","grpc"],description:"Centrifugo has GRPC subscription streams feature, in this post we show how this feature may simplify a task of delivering data to application UI in real-time. We integrate with Loki, injest log entries and stream logs to the browser based on user-supplied query",author:"Alexander Emelin",authorTitle:"Founder of Centrifugal Labs",authorImageURL:"/img/alexander_emelin.jpeg",image:"/img/centrifugo_loki.jpg",hide_table_of_contents:!1},unlisted:!1,nextItem:{title:"Discovering Centrifugo PRO: push notifications API",permalink:"/blog/2023/10/29/discovering-centrifugo-pro-push-notifications"}},l={authorsImageUrls:[void 0]},c=[{value:"What Are Proxy Subscription Streams?",id:"what-are-proxy-subscription-streams",level:2},{value:"Demo and source code",id:"demo-and-source-code",level:2},{value:"Setting Up Loki",id:"setting-up-loki",level:2},{value:"Configuring Centrifugo",id:"configuring-centrifugo",level:2},{value:"Writing frontend",id:"writing-frontend",level:2},{value:"Handle subscription stream on the Go side",id:"handle-subscription-stream-on-the-go-side",level:2},{value:"Conclusion",id:"conclusion",level:2}];function d(e){const t={a:"a",code:"code",h2:"h2",img:"img",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.a)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("img",{src:"/img/centrifugo_loki.jpg"}),"\n",(0,r.jsx)(t.p,{children:"As of version 5.1.0, Centrifugo introduces an experimental yet powerful extension that promises to simplify the data delivery process to the browser using GRPC streams. We believe it may help you to solve some practical tasks in minutes. Let's dive into how this feature works and how you can leverage it in your applications integrating with Loki real-time log streaming capabilities."}),"\n",(0,r.jsx)(t.h2,{id:"what-are-proxy-subscription-streams",children:"What Are Proxy Subscription Streams?"}),"\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.a,{href:"/docs/server/proxy_streams",children:"Proxy Subscription Streams"})," support pushing data directly to Centrifugo client channel subscriptions from your application backend over GRPC streams. This feature is designed to facilitate individual data streams to clients as soon as they subscribe to a channel, acting as a bridge between WebSocket connections from clients and GRPC streams to the backend. It supports both unidirectional (backend to client) and bidirectional (both ways) streams, thereby enhancing flexibility in data streaming."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{src:n(75968).Z+"",width:"3242",height:"1065"})}),"\n",(0,r.jsx)(t.p,{children:"Establishing a stream between Centrifugo and your application backend upon a channel subscription provides a straightforward path for data to travel directly to the subscribed clients. This mechanism not only simplifies the architecture for real-time data delivery but also ensures fast and individualized data streaming."}),"\n",(0,r.jsxs)(t.p,{children:["The design is inspired by ",(0,r.jsx)(t.a,{href:"http://websocketd.com/",children:"Websocketd"})," server \u2013 but while Websocketd transforms data from programs running locally, Centrifugo provides a more generic network interface with GRPC. And all other features of Centrifugo like connection authentication, online presence come as a great bonus."]}),"\n",(0,r.jsx)(t.p,{children:"In the documentation for Proxy Subscription Streams we mentioned streaming logs from Loki as one of the possible use cases. Let's expand on the idea and implement the working solution in just 10 minutes."}),"\n",(0,r.jsx)(t.h2,{id:"demo-and-source-code",children:"Demo and source code"}),"\n",(0,r.jsx)(t.p,{children:"Here is a demo of what we well get:"}),"\n",(0,r.jsx)("video",{width:"100%",loop:!0,autoPlay:"autoplay",muted:!0,controls:"",src:"/img/loki.mp4"}),"\n",(0,r.jsxs)(t.p,{children:["Take a look at ",(0,r.jsx)(t.a,{href:"https://github.com/centrifugal/examples/tree/master/v5/subscription_streams_loki",children:"full source code on Github"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"setting-up-loki",children:"Setting Up Loki"}),"\n",(0,r.jsx)(t.p,{children:"Loki is a horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. It is designed to be very cost-effective and easy to operate, making it a perfect candidate for our real-time log streaming example."}),"\n",(0,r.jsxs)(t.p,{children:["We will build the example using Docker Compose, all we have to do for the example is to include Loki image to ",(0,r.jsx)(t.code,{children:"docker-compose.yml"}),":"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-yaml",children:'services:\n loki:\n image: grafana/loki:latest\n ports:\n - "3100:3100"\n'})}),"\n",(0,r.jsx)(t.p,{children:"Loki can ingest logs via various methods, including Promtail, Grafana Agent, Fluentd, and more. For simplicity, we will send logs to Loki ourselves from the Go application."}),"\n",(0,r.jsx)(t.p,{children:"To send logs to Loki, we can use the HTTP API that Loki provides. This is a straightforward way to push logs directly from an application. The example below demonstrates how to create a simple Go application that generates logs and sends them to Loki using HTTP POST requests."}),"\n",(0,r.jsx)(t.p,{children:"First, define a function to send a log entry to Loki:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-go",children:'const (\n\tlokiPushEndpoint = "http://loki:3100/loki/api/v1/push"\n)\n\ntype lokiPushMessage struct {\n\tStreams []lokiStream `json:"streams"`\n}\n\ntype lokiStream struct {\n\tStream map[string]string `json:"stream"`\n\tValues [][]string `json:"values"`\n}\n\nfunc sendLogMessageToLoki(_ context.Context) error {\n\tsources := []string{"backend1", "backend2", "backend3"}\n\tsource := sources[rand.Intn(len(sources))]\n\tlogMessage := fmt.Sprintf("log from %s source", source)\n\n\tpayload := lokiPushMessage{\n\t\tStreams: []lokiStream{\n\t\t\t{\n\t\t\t\tStream: map[string]string{\n\t\t\t\t\t"source": source,\n\t\t\t\t},\n\t\t\t\tValues: [][]string{\n\t\t\t\t\t{fmt.Sprintf("%d", time.Now().UnixNano()), logMessage},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n\n\tjsonData, err := json.Marshal(payload)\n\tif err != nil {\n\t\treturn err\n\t}\n\tresp, err := http.Post(\n\t\tlokiPushEndpoint, "application/json", bytes.NewBuffer(jsonData))\n\tif err != nil {\n\t\treturn err\n\t}\n\tdefer resp.Body.Close()\n\n\tif resp.StatusCode != http.StatusNoContent {\n\t\treturn fmt.Errorf("unexpected status code: %d", resp.StatusCode)\n\t}\n\treturn nil\n}\n\nfunc sendLogsToLoki(ctx context.Context) {\n\tfor {\n\t\tselect {\n\t\tcase <-ctx.Done():\n\t\t\treturn\n\t\tcase <-time.After(200 * time.Millisecond):\n\t\t\terr := sendLogMessageToLoki(ctx)\n\t\t\tif err != nil {\n\t\t\t\tlog.Println("error sending log to Loki:", err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc main() {\n\tctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)\n\tdefer cancel()\n\n\tsendLogsToLoki(ctx)\n}\n'})}),"\n",(0,r.jsxs)(t.p,{children:["This program defines a ",(0,r.jsx)(t.code,{children:"sendLogsToLoki"})," function that constructs a log entry and sends it to Loki using its HTTP API. It continuously generates log messages every 200 milliseconds."]}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.code,{children:"lokiPushMessage"})," struct is structured to match the JSON payload expected by Loki's ",(0,r.jsx)(t.a,{href:"https://grafana.com/docs/loki/latest/reference/api/#push-log-entries-to-loki",children:(0,r.jsx)(t.code,{children:"/loki/api/v1/push"})})," endpoint. Each log entry consists of a set of labels (in the Stream map) and log line values, where each value is a two-element array containing the timestamp and the log line. The timestamp is in nanoseconds to match Loki's expected format."]}),"\n",(0,r.jsxs)(t.p,{children:["Note, in the example we randomly set log entry ",(0,r.jsx)(t.code,{children:"source"})," label choosing between ",(0,r.jsx)(t.code,{children:"backend1"}),", ",(0,r.jsx)(t.code,{children:"backend2"})," and ",(0,r.jsx)(t.code,{children:"backend3"})," values."]}),"\n",(0,r.jsx)(t.p,{children:"At this point our program pushes some logs to Loki, now let's add Centrifugo to consume them from browser in real-time."}),"\n",(0,r.jsx)(t.h2,{id:"configuring-centrifugo",children:"Configuring Centrifugo"}),"\n",(0,r.jsx)(t.p,{children:"Adding Centrifugo is also rather straightforward:"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{children:"services:\n centrifugo:\n image: centrifugo/centrifugo:v5.3.0\n restart: unless-stopped\n volumes:\n - ./centrifugo/config.json:/centrifugo/config.json\n command: centrifugo -c config.json\n expose:\n - 8000\n"})}),"\n",(0,r.jsxs)(t.p,{children:["Where ",(0,r.jsx)(t.code,{children:"config.json"})," is:"]}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-json",children:'{\n "client_insecure": true,\n "allowed_origins": ["http://localhost:9000"],\n "proxy_subscribe_stream_endpoint": "grpc://backend:12000",\n "proxy_subscribe_stream_timeout": "3s",\n "namespaces": [\n {\n "name": "logs",\n "proxy_subscribe_stream": true\n }\n ]\n}\n'})}),"\n",(0,r.jsxs)(t.p,{children:["Note, we enabled ",(0,r.jsx)(t.code,{children:"client_insecure"})," option here \u2013 this is to keep example short, but in real live you may benefit from Centrifugo authentication: ",(0,r.jsx)(t.a,{href:"/docs/server/authentication",children:"JWT-based"})," or ",(0,r.jsx)(t.a,{href:"/docs/server/proxy#connect-proxy",children:"proxy-based"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"writing-frontend",children:"Writing frontend"}),"\n",(0,r.jsx)(t.pre,{children:(0,r.jsx)(t.code,{className:"language-html",children:'\n\n\n \n Streaming logs with Centrifugo and Loki\n\n\n
\n
\n \n \n
\n
\n
    \n
    \n
    \n - + + -
    Skip to main content
    October 29, 2023 by Alexander Emelin
    We start talking more about recently launched Centrifugo PRO. In this post, we share details about Centrifugo PRO push notification API implementation - how it works and what makes it special and practical.
    August 29, 2023 by Centrifugal + RabbitX
    In this post, the engineering team of RabbitX platform shares details about the usage of Centrifugo in their product.
    August 19, 2023 by Alexander Emelin
    In this post, we'll demonstrate how to asynchronously stream messages into Centrifugo channels from external data providers using Benthos tool. We also highlight some pitfalls which become more important in asynchronous publishing scenario.
    June 29, 2023 by Centrifugal team
    We are excited to announce a new version of Centrifugo. It's an evolutionary step which makes Centrifugo cleaner and more intuitive to use.
    July 19, 2022 by Centrifugal team
    Centrifugo v4 provides an optimized client protocol, modern WebSocket emulation, improved channel security, redesigned client SDK behavior, experimental HTTP/3 and WebTransport support.
    October 18, 2021 by Alexander Emelin
    In this tutorial we are integrating Centrifugo with NodeJS. We are using Centrifugo connect proxy feature to authenticate connections over standard Express.js session middleware.
    August 31, 2021 by Centrifugal team
    Centrifugo v3 released with lots of exciting improvements
    November 12, 2020 by Alexander Emelin
    The post describes techniques to write scalable WebSocket servers within Go ecosystem and beyond it
    February 10, 2020 by Centrifugal team
    Describing a test stand in Kubernetes where we connect one million websocket connections to a server, using Redis to scale nodes, and providing insights about hardware resources required to achieve 500k messages per second
    +
    Skip to main content
    October 29, 2023 by Alexander Emelin
    We start talking more about recently launched Centrifugo PRO. In this post, we share details about Centrifugo PRO push notification API implementation - how it works and what makes it special and practical.
    August 29, 2023 by Centrifugal + RabbitX
    In this post, the engineering team of RabbitX platform shares details about the usage of Centrifugo in their product.
    August 19, 2023 by Alexander Emelin
    In this post, we'll demonstrate how to asynchronously stream messages into Centrifugo channels from external data providers using Benthos tool. We also highlight some pitfalls which become more important in asynchronous publishing scenario.
    June 29, 2023 by Centrifugal team
    We are excited to announce a new version of Centrifugo. It's an evolutionary step which makes Centrifugo cleaner and more intuitive to use.
    July 19, 2022 by Centrifugal team
    Centrifugo v4 provides an optimized client protocol, modern WebSocket emulation, improved channel security, redesigned client SDK behavior, experimental HTTP/3 and WebTransport support.
    October 18, 2021 by Alexander Emelin
    In this tutorial we are integrating Centrifugo with NodeJS. We are using Centrifugo connect proxy feature to authenticate connections over standard Express.js session middleware.
    August 31, 2021 by Centrifugal team
    Centrifugo v3 released with lots of exciting improvements
    November 12, 2020 by Alexander Emelin
    The post describes techniques to write scalable WebSocket servers within Go ecosystem and beyond it
    February 10, 2020 by Centrifugal team
    Describing a test stand in Kubernetes where we connect one million websocket connections to a server, using Redis to scale nodes, and providing insights about hardware resources required to achieve 500k messages per second
    \ No newline at end of file diff --git a/blog/2020/02/10/million-connections-with-centrifugo.html b/blog/2020/02/10/million-connections-with-centrifugo.html index 14b8385aa..445f65a0a 100644 --- a/blog/2020/02/10/million-connections-with-centrifugo.html +++ b/blog/2020/02/10/million-connections-with-centrifugo.html @@ -15,8 +15,8 @@ - - + +
    Skip to main content

    Million connections with Centrifugo

    · 4 min read
    Centrifugal team
    diff --git a/blog/2020/10/16/experimenting-with-quic-transport.html b/blog/2020/10/16/experimenting-with-quic-transport.html index 53b7f9db8..055b5ae7c 100644 --- a/blog/2020/10/16/experimenting-with-quic-transport.html +++ b/blog/2020/10/16/experimenting-with-quic-transport.html @@ -15,8 +15,8 @@ - - + +

    Experimenting with QUIC and WebTransport

    · 15 min read
    Alexander Emelin

    post-cover

    diff --git a/blog/2020/11/12/scaling-websocket.html b/blog/2020/11/12/scaling-websocket.html index 543c196d9..0ee92c97c 100644 --- a/blog/2020/11/12/scaling-websocket.html +++ b/blog/2020/11/12/scaling-websocket.html @@ -15,8 +15,8 @@ - - + +

    Scaling WebSocket in Go and beyond

    · 19 min read
    Alexander Emelin

    gopher-broker

    diff --git a/blog/2021/01/15/centrifuge-intro.html b/blog/2021/01/15/centrifuge-intro.html index e29571693..14d654a46 100644 --- a/blog/2021/01/15/centrifuge-intro.html +++ b/blog/2021/01/15/centrifuge-intro.html @@ -15,8 +15,8 @@ - - + +

    Centrifuge – real-time messaging with Go

    · 23 min read
    Alexander Emelin

    Centrifuge

    diff --git a/blog/2021/08/31/hello-centrifugo-v3.html b/blog/2021/08/31/hello-centrifugo-v3.html index 11dfeb38e..8cbe1a904 100644 --- a/blog/2021/08/31/hello-centrifugo-v3.html +++ b/blog/2021/08/31/hello-centrifugo-v3.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo v3 released

    · 15 min read
    Centrifugal team

    Centrifuge

    diff --git a/blog/2021/10/18/integrating-with-nodejs.html b/blog/2021/10/18/integrating-with-nodejs.html index 4bdd8773f..317ddac82 100644 --- a/blog/2021/10/18/integrating-with-nodejs.html +++ b/blog/2021/10/18/integrating-with-nodejs.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo integration with NodeJS tutorial

    · 7 min read
    Alexander Emelin

    Centrifuge

    diff --git a/blog/2021/11/04/integrating-with-django-building-chat-application.html b/blog/2021/11/04/integrating-with-django-building-chat-application.html index f7ca5f035..642eb0317 100644 --- a/blog/2021/11/04/integrating-with-django-building-chat-application.html +++ b/blog/2021/11/04/integrating-with-django-building-chat-application.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo integration with Django – building a basic chat application

    · 16 min read
    Alexander Emelin

    Centrifuge

    diff --git a/blog/2021/12/14/laravel-multi-room-chat-tutorial.html b/blog/2021/12/14/laravel-multi-room-chat-tutorial.html index 61ced8820..a52e9ce39 100644 --- a/blog/2021/12/14/laravel-multi-room-chat-tutorial.html +++ b/blog/2021/12/14/laravel-multi-room-chat-tutorial.html @@ -15,8 +15,8 @@ - - + +

    Building a multi-room chat application with Laravel and Centrifugo

    · 11 min read
    Anton Silischev

    Image

    diff --git a/blog/2022/07/19/centrifugo-v4-released.html b/blog/2022/07/19/centrifugo-v4-released.html index 965af176b..ea0ab75cb 100644 --- a/blog/2022/07/19/centrifugo-v4-released.html +++ b/blog/2022/07/19/centrifugo-v4-released.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo v4 released – a little revolution

    · 21 min read
    Centrifugal team

    Centrifuge

    diff --git a/blog/2022/07/29/101-way-to-subscribe.html b/blog/2022/07/29/101-way-to-subscribe.html index 50c4d4d01..8ffaa88b9 100644 --- a/blog/2022/07/29/101-way-to-subscribe.html +++ b/blog/2022/07/29/101-way-to-subscribe.html @@ -15,8 +15,8 @@ - - + +

    101 ways to subscribe user on a personal channel in Centrifugo

    · 11 min read
    Alexander Emelin

    Centrifuge

    diff --git a/blog/2022/12/20/improving-redis-engine-performance.html b/blog/2022/12/20/improving-redis-engine-performance.html index 5ba7a3495..34486e4be 100644 --- a/blog/2022/12/20/improving-redis-engine-performance.html +++ b/blog/2022/12/20/improving-redis-engine-performance.html @@ -15,8 +15,8 @@ - - + +

    Improving Centrifugo Redis Engine throughput and allocation efficiency with Rueidis Go library

    · 29 min read
    Alexander Emelin

    Centrifugo_Redis_Engine_Improvements

    diff --git a/blog/2023/03/31/keycloak-sso-centrifugo.html b/blog/2023/03/31/keycloak-sso-centrifugo.html index 9d27735e0..3341acbe1 100644 --- a/blog/2023/03/31/keycloak-sso-centrifugo.html +++ b/blog/2023/03/31/keycloak-sso-centrifugo.html @@ -15,8 +15,8 @@ - - + +

    Setting up Keycloak SSO authentication flow and connecting to Centrifugo WebSocket

    · 5 min read
    Alexander Emelin

    diff --git a/blog/2023/06/29/centrifugo-v5-released.html b/blog/2023/06/29/centrifugo-v5-released.html index dcad47e85..deafa8fa3 100644 --- a/blog/2023/06/29/centrifugo-v5-released.html +++ b/blog/2023/06/29/centrifugo-v5-released.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo v5 released

    · 13 min read
    Centrifugal team

    In Centrifugo v5 we're phasing out old client protocol support, introducing a more intuitive HTTP API, adjusting token management behaviour in SDKs, improving configuration process, and refactoring the history meta ttl option. As the result you get a cleaner, more user-friendly, and optimized Centrifugo experience. And we have important news about the project - check it out in the end of this post.

    diff --git a/blog/2023/08/19/asynchronous-message-streaming-to-centrifugo-with-benthos.html b/blog/2023/08/19/asynchronous-message-streaming-to-centrifugo-with-benthos.html index 76a1b36c2..7697d5af5 100644 --- a/blog/2023/08/19/asynchronous-message-streaming-to-centrifugo-with-benthos.html +++ b/blog/2023/08/19/asynchronous-message-streaming-to-centrifugo-with-benthos.html @@ -15,8 +15,8 @@ - - + +

    Asynchronous message streaming to Centrifugo with Benthos

    · 8 min read
    Alexander Emelin
    diff --git a/blog/2023/08/29/using-centrifugo-in-rabbitx.html b/blog/2023/08/29/using-centrifugo-in-rabbitx.html index 27be414a3..4b36c80a8 100644 --- a/blog/2023/08/29/using-centrifugo-in-rabbitx.html +++ b/blog/2023/08/29/using-centrifugo-in-rabbitx.html @@ -15,8 +15,8 @@ - - + +

    Using Centrifugo in RabbitX

    · 4 min read
    Centrifugal + RabbitX
    diff --git a/blog/2023/10/29/discovering-centrifugo-pro-push-notifications.html b/blog/2023/10/29/discovering-centrifugo-pro-push-notifications.html index 671b35ca2..67e95c92f 100644 --- a/blog/2023/10/29/discovering-centrifugo-pro-push-notifications.html +++ b/blog/2023/10/29/discovering-centrifugo-pro-push-notifications.html @@ -15,8 +15,8 @@ - - + +

    Discovering Centrifugo PRO: push notifications API

    · 14 min read
    Alexander Emelin
    @@ -110,6 +110,6 @@

    Conclusion

    We really believe in our push notifications and will be working hard to make them even better. The API we already have serves well to cover common push notification delivery use cases, but we won't stop here. Some areas for improvements are: functionality of built-in push notifications web UI, extending push analytics by providing user friendly UI for the insights about push delivery and engagement. The good thing is that we already have a ground for making this.

    Take a look at the documentation of Centrifugo PRO push notification API for more formal details and some things not mentioned here. Probably at the time you are reading this we already added something great to the API.

    -

    Even though Centrifugo PRO is pretty new, it already has a lot of helpful features, and we have plans to add even more. You can see what’s coming up next on our Centrifugo PRO planned features board. We're excited to share more blog posts like this one in the future.

    +

    Even though Centrifugo PRO is pretty new, it already has a lot of helpful features, and we have plans to add even more. You can see what’s coming up next on our Centrifugo PRO planned features board. We're excited to share more blog posts like this one in the future.

    \ No newline at end of file diff --git a/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions.html b/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions.html new file mode 100644 index 000000000..e05e7f82e --- /dev/null +++ b/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions.html @@ -0,0 +1,77 @@ + + + + + +Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions | Centrifugo + + + + + + + + + + + + + + + +

    Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions

    · 8 min read
    Alexander Emelin
    +

    As of version 5.1.0, Centrifugo introduces an experimental yet powerful extension that promises to simplify the data delivery process to the browser using GRPC streams. We believe it may help you to solve some practical tasks in minutes. Let's dive into how this feature works and how you can leverage it in your applications integrating with Loki real-time log streaming capabilities.

    +

    What Are Proxy Subscription Streams?

    +

    Proxy Subscription Streams support pushing data directly to Centrifugo client channel subscriptions from your application backend over GRPC streams. This feature is designed to facilitate individual data streams to clients as soon as they subscribe to a channel, acting as a bridge between WebSocket connections from clients and GRPC streams to the backend. It supports both unidirectional (backend to client) and bidirectional (both ways) streams, thereby enhancing flexibility in data streaming.

    +

    +

    Establishing a stream between Centrifugo and your application backend upon a channel subscription provides a straightforward path for data to travel directly to the subscribed clients. This mechanism not only simplifies the architecture for real-time data delivery but also ensures fast and individualized data streaming.

    +

    The design is inspired by Websocketd server – but while Websocketd transforms data from programs running locally, Centrifugo provides a more generic network interface with GRPC. And all other features of Centrifugo like connection authentication, online presence come as a great bonus.

    +

    In the documentation for Proxy Subscription Streams we mentioned streaming logs from Loki as one of the possible use cases. Let's expand on the idea and implement the working solution in just 10 minutes.

    +

    Demo and source code

    +

    Here is a demo of what we well get:

    + +

    Take a look at full source code on Github.

    +

    Setting Up Loki

    +

    Loki is a horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. It is designed to be very cost-effective and easy to operate, making it a perfect candidate for our real-time log streaming example.

    +

    We will build the example using Docker Compose, all we have to do for the example is to include Loki image to docker-compose.yml:

    +
    services:
    loki:
    image: grafana/loki:latest
    ports:
    - "3100:3100"
    +

    Loki can ingest logs via various methods, including Promtail, Grafana Agent, Fluentd, and more. For simplicity, we will send logs to Loki ourselves from the Go application.

    +

    To send logs to Loki, we can use the HTTP API that Loki provides. This is a straightforward way to push logs directly from an application. The example below demonstrates how to create a simple Go application that generates logs and sends them to Loki using HTTP POST requests.

    +

    First, define a function to send a log entry to Loki:

    +
    const (
    lokiPushEndpoint = "http://loki:3100/loki/api/v1/push"
    )

    type lokiPushMessage struct {
    Streams []lokiStream `json:"streams"`
    }

    type lokiStream struct {
    Stream map[string]string `json:"stream"`
    Values [][]string `json:"values"`
    }

    func sendLogMessageToLoki(_ context.Context) error {
    sources := []string{"backend1", "backend2", "backend3"}
    source := sources[rand.Intn(len(sources))]
    logMessage := fmt.Sprintf("log from %s source", source)

    payload := lokiPushMessage{
    Streams: []lokiStream{
    {
    Stream: map[string]string{
    "source": source,
    },
    Values: [][]string{
    {fmt.Sprintf("%d", time.Now().UnixNano()), logMessage},
    },
    },
    },
    }

    jsonData, err := json.Marshal(payload)
    if err != nil {
    return err
    }
    resp, err := http.Post(
    lokiPushEndpoint, "application/json", bytes.NewBuffer(jsonData))
    if err != nil {
    return err
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusNoContent {
    return fmt.Errorf("unexpected status code: %d", resp.StatusCode)
    }
    return nil
    }

    func sendLogsToLoki(ctx context.Context) {
    for {
    select {
    case <-ctx.Done():
    return
    case <-time.After(200 * time.Millisecond):
    err := sendLogMessageToLoki(ctx)
    if err != nil {
    log.Println("error sending log to Loki:", err)
    continue
    }
    }
    }
    }

    func main() {
    ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)
    defer cancel()

    sendLogsToLoki(ctx)
    }
    +

    This program defines a sendLogsToLoki function that constructs a log entry and sends it to Loki using its HTTP API. It continuously generates log messages every 200 milliseconds.

    +

    The lokiPushMessage struct is structured to match the JSON payload expected by Loki's /loki/api/v1/push endpoint. Each log entry consists of a set of labels (in the Stream map) and log line values, where each value is a two-element array containing the timestamp and the log line. The timestamp is in nanoseconds to match Loki's expected format.

    +

    Note, in the example we randomly set log entry source label choosing between backend1, backend2 and backend3 values.

    +

    At this point our program pushes some logs to Loki, now let's add Centrifugo to consume them from browser in real-time.

    +

    Configuring Centrifugo

    +

    Adding Centrifugo is also rather straightforward:

    +
    services:
    centrifugo:
    image: centrifugo/centrifugo:v5.3.0
    restart: unless-stopped
    volumes:
    - ./centrifugo/config.json:/centrifugo/config.json
    command: centrifugo -c config.json
    expose:
    - 8000
    +

    Where config.json is:

    +
    {
    "client_insecure": true,
    "allowed_origins": ["http://localhost:9000"],
    "proxy_subscribe_stream_endpoint": "grpc://backend:12000",
    "proxy_subscribe_stream_timeout": "3s",
    "namespaces": [
    {
    "name": "logs",
    "proxy_subscribe_stream": true
    }
    ]
    }
    +

    Note, we enabled client_insecure option here – this is to keep example short, but in real live you may benefit from Centrifugo authentication: JWT-based or proxy-based.

    +

    Writing frontend

    +
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Streaming logs with Centrifugo and Loki</title>
    </head>
    <body>
    <div id="app">
    <form id="input" onsubmit="subscribeToLogs(event)">
    <input type="text" id="query" autocomplete="off" placeholder="Enter log query" />
    <button id="submit" type="submit">SUBSCRIBE</button>
    </form>
    <div id="logs" style="margin-top: 20px;">
    <ul id="lines"></ul>
    </div>
    </div>
    <script src="https://unpkg.com/centrifuge@^5/dist/centrifuge.js"></script>
    <script src="app.js"></script>
    </body>
    </html>
    +

    In the final version we've also included some CSS to this HTML to make it look nicer.

    +

    And our Javascript code in app.js:

    +
    const logs = document.getElementById('logs');
    const lines = document.getElementById('lines');
    const queryInput = document.getElementById('query');
    const button = document.getElementById('submit');

    function subscribeToLogs(e) {
    e.preventDefault();

    const query = queryInput.value;
    if (!query) {
    alert('Please enter a query.');
    return;
    }
    queryInput.disabled = true;
    button.disabled = true;

    const centrifuge = new Centrifuge('ws://localhost:9000/connection/websocket');

    const subscription = centrifuge.newSubscription('logs:stream', {
    data: { query: query }
    });

    subscription.on('publication', function(ctx) {
    const logLine = ctx.data.line;
    const logItem = document.createElement('li');
    logItem.textContent = logLine;
    lines.appendChild(logItem);
    logs.scrollTop = logs.scrollHeight;
    });

    subscription.subscribe();
    centrifuge.connect();
    }
    +

    In the final example we've also added Nginx container to serve static files and proxy WebSocket connections to Centrifugo. Check it out in the source code.

    +

    When user enters Loki query to input, subscription goes to Centrifugo and Centrifugo then realizes it's a proxy stream subscription. So it calls the backend GRPC endpoint (backend:12000) and expect it to implement unidirectional GRPC stream conract. Let's implement it.

    +

    Handle subscription stream on the Go side

    +

    On your backend, you'll implement a GRPC service that interacts with Loki to tail logs and then re-send them to Centrifugo subscription stream. Let's implement such service. We first need to take Centrifugo proxy.proto definitions. And we will implement SubscribeUnidirectional method from it.

    +

    You need to install protoc, also install plugins for Go and GRPC:

    +
    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
    +

    And then:

    +
    protoc -I ./ proxy.proto --go_out=./ --go-grpc_out=./
    +

    This will generate Protobuf messages and GRPC code. Let's implement our server now:

    +
    const (
    lokiGRPCAddress = "loki:9095"
    )

    type streamerServer struct {
    pb.UnimplementedCentrifugoProxyServer
    lokiQuerierClient logproto.QuerierClient
    }

    type clientData struct {
    Query string `json:"query"`
    }

    func (s *streamerServer) SubscribeUnidirectional(
    req *pb.SubscribeRequest,
    stream pb.CentrifugoProxy_SubscribeUnidirectionalServer,
    ) error {
    var cd clientData
    err := json.Unmarshal(req.Data, &cd)
    if err != nil {
    return fmt.Errorf("error unmarshaling data: %w", err)
    }
    query := &logproto.TailRequest{
    Query: cd.Query,
    }
    ctx, cancel := context.WithCancel(stream.Context())
    defer cancel()

    logStream, err := s.lokiQuerierClient.Tail(ctx, query)
    if err != nil {
    return fmt.Errorf("error querying Loki: %w", err)
    }

    started := time.Now()
    log.Println("unidirectional subscribe called with request", req)
    defer func() {
    log.Println("unidirectional subscribe finished, elapsed", time.Since(started))
    }()
    err = stream.Send(&pb.StreamSubscribeResponse{
    SubscribeResponse: &pb.SubscribeResponse{},
    })
    if err != nil {
    return err
    }

    for {
    select {
    case <-stream.Context().Done():
    return stream.Context().Err()
    default:
    resp, err := logStream.Recv()
    if err != nil {
    return fmt.Errorf("error receiving from Loki stream: %v", err)
    }
    for _, entry := range resp.Stream.Entries {
    line := fmt.Sprintf("%s: %s", entry.Timestamp.Format("2006-01-02T15:04:05.000Z07:00"), entry.Line)
    err = stream.Send(&pb.StreamSubscribeResponse{
    Publication: &pb.Publication{Data: []byte(`{"line":"` + line + `"}`)},
    })
    if err != nil {
    return err
    }
    }
    }
    }
    }

    func main() {
    querierConn, err := grpc.Dial(lokiGRPCAddress, grpc.WithTransportCredentials(insecure.NewCredentials()))
    if err != nil {
    log.Fatalf("failed to dial Loki: %v", err)
    }
    querierClient := logproto.NewQuerierClient(querierConn)

    addr := ":12000"
    lis, err := net.Listen("tcp", addr)
    if err != nil {
    log.Fatalf("failed to listen: %v", err)
    }

    s := grpc.NewServer(grpc.MaxConcurrentStreams(math.MaxUint32))
    pb.RegisterCentrifugoProxyServer(s, &streamerServer{
    lokiQuerierClient: querierClient,
    })

    log.Println("Server listening on", addr)
    if err := s.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %v", err)
    }
    }
    +

    Things to note:

    +
      +
    • Loki also supports GRPC interface to tail logs, so we use it here. We could also use Loki WebSocket endpoint /loki/api/v1/tail but this would mean establishing new connection for every tail operation - with GRPC we can use many concurrent tail requests all multiplexed over a single network connection.
    • +
    • When subscription stream initialized from Centrifugo side we start tailing logs from Loki and resend them to Centrifugo
    • +
    • Centrifugo then packs data to WebSocket connection and delivers to browser.
    • +
    +

    Conclusion

    +

    Subscription streams may be a very powerful generic feature in your arsenal. Here we've shown how simple it could be to make a proof of concept of the real-time application which consumes individual data from third-party streaming provider.

    +

    Centrifugo provides WebSocket SDKs for popular languages used to build UI layer, provides authentication and proper management of real-time connections. And with subscription streams feature Centrifugo gives you an answer on how to quickly translate real-time data based on individual query to user.

    + + \ No newline at end of file diff --git a/blog/archive.html b/blog/archive.html index bc707f595..4db67d548 100644 --- a/blog/archive.html +++ b/blog/archive.html @@ -15,10 +15,10 @@ - - + + - + \ No newline at end of file diff --git a/blog/atom.xml b/blog/atom.xml index 3dadea30a..1411baeab 100644 --- a/blog/atom.xml +++ b/blog/atom.xml @@ -2,11 +2,78 @@ https://centrifugal.dev/blog - <updated>2023-10-29T00:00:00.000Z</updated> + <updated>2024-03-18T00:00:00.000Z</updated> <generator>https://github.com/jpmonette/feed</generator> <link rel="alternate" href="https://centrifugal.dev/blog"/> <icon>https://centrifugal.dev/img/favicon.png</icon> <rights>Centrifugal Labs LTD</rights> + <entry> + <title type="html"><![CDATA[Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions]]> + https://centrifugal.dev/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions + + 2024-03-18T00:00:00.000Z + + +

    As of version 5.1.0, Centrifugo introduces an experimental yet powerful extension that promises to simplify the data delivery process to the browser using GRPC streams. We believe it may help you to solve some practical tasks in minutes. Let's dive into how this feature works and how you can leverage it in your applications integrating with Loki real-time log streaming capabilities.

    +

    What Are Proxy Subscription Streams?

    +

    Proxy Subscription Streams support pushing data directly to Centrifugo client channel subscriptions from your application backend over GRPC streams. This feature is designed to facilitate individual data streams to clients as soon as they subscribe to a channel, acting as a bridge between WebSocket connections from clients and GRPC streams to the backend. It supports both unidirectional (backend to client) and bidirectional (both ways) streams, thereby enhancing flexibility in data streaming.

    +

    +

    Establishing a stream between Centrifugo and your application backend upon a channel subscription provides a straightforward path for data to travel directly to the subscribed clients. This mechanism not only simplifies the architecture for real-time data delivery but also ensures fast and individualized data streaming.

    +

    The design is inspired by Websocketd server – but while Websocketd transforms data from programs running locally, Centrifugo provides a more generic network interface with GRPC. And all other features of Centrifugo like connection authentication, online presence come as a great bonus.

    +

    In the documentation for Proxy Subscription Streams we mentioned streaming logs from Loki as one of the possible use cases. Let's expand on the idea and implement the working solution in just 10 minutes.

    +

    Demo and source code

    +

    Here is a demo of what we well get:

    + +

    Take a look at full source code on Github.

    +

    Setting Up Loki

    +

    Loki is a horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. It is designed to be very cost-effective and easy to operate, making it a perfect candidate for our real-time log streaming example.

    +

    We will build the example using Docker Compose, all we have to do for the example is to include Loki image to docker-compose.yml:

    +
    services:
    loki:
    image: grafana/loki:latest
    ports:
    - "3100:3100"
    +

    Loki can ingest logs via various methods, including Promtail, Grafana Agent, Fluentd, and more. For simplicity, we will send logs to Loki ourselves from the Go application.

    +

    To send logs to Loki, we can use the HTTP API that Loki provides. This is a straightforward way to push logs directly from an application. The example below demonstrates how to create a simple Go application that generates logs and sends them to Loki using HTTP POST requests.

    +

    First, define a function to send a log entry to Loki:

    +
    const (
    lokiPushEndpoint = "http://loki:3100/loki/api/v1/push"
    )

    type lokiPushMessage struct {
    Streams []lokiStream `json:"streams"`
    }

    type lokiStream struct {
    Stream map[string]string `json:"stream"`
    Values [][]string `json:"values"`
    }

    func sendLogMessageToLoki(_ context.Context) error {
    sources := []string{"backend1", "backend2", "backend3"}
    source := sources[rand.Intn(len(sources))]
    logMessage := fmt.Sprintf("log from %s source", source)

    payload := lokiPushMessage{
    Streams: []lokiStream{
    {
    Stream: map[string]string{
    "source": source,
    },
    Values: [][]string{
    {fmt.Sprintf("%d", time.Now().UnixNano()), logMessage},
    },
    },
    },
    }

    jsonData, err := json.Marshal(payload)
    if err != nil {
    return err
    }
    resp, err := http.Post(
    lokiPushEndpoint, "application/json", bytes.NewBuffer(jsonData))
    if err != nil {
    return err
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusNoContent {
    return fmt.Errorf("unexpected status code: %d", resp.StatusCode)
    }
    return nil
    }

    func sendLogsToLoki(ctx context.Context) {
    for {
    select {
    case <-ctx.Done():
    return
    case <-time.After(200 * time.Millisecond):
    err := sendLogMessageToLoki(ctx)
    if err != nil {
    log.Println("error sending log to Loki:", err)
    continue
    }
    }
    }
    }

    func main() {
    ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)
    defer cancel()

    sendLogsToLoki(ctx)
    }
    +

    This program defines a sendLogsToLoki function that constructs a log entry and sends it to Loki using its HTTP API. It continuously generates log messages every 200 milliseconds.

    +

    The lokiPushMessage struct is structured to match the JSON payload expected by Loki's /loki/api/v1/push endpoint. Each log entry consists of a set of labels (in the Stream map) and log line values, where each value is a two-element array containing the timestamp and the log line. The timestamp is in nanoseconds to match Loki's expected format.

    +

    Note, in the example we randomly set log entry source label choosing between backend1, backend2 and backend3 values.

    +

    At this point our program pushes some logs to Loki, now let's add Centrifugo to consume them from browser in real-time.

    +

    Configuring Centrifugo

    +

    Adding Centrifugo is also rather straightforward:

    +
    services:
    centrifugo:
    image: centrifugo/centrifugo:v5.3.0
    restart: unless-stopped
    volumes:
    - ./centrifugo/config.json:/centrifugo/config.json
    command: centrifugo -c config.json
    expose:
    - 8000
    +

    Where config.json is:

    +
    {
    "client_insecure": true,
    "allowed_origins": ["http://localhost:9000"],
    "proxy_subscribe_stream_endpoint": "grpc://backend:12000",
    "proxy_subscribe_stream_timeout": "3s",
    "namespaces": [
    {
    "name": "logs",
    "proxy_subscribe_stream": true
    }
    ]
    }
    +

    Note, we enabled client_insecure option here – this is to keep example short, but in real live you may benefit from Centrifugo authentication: JWT-based or proxy-based.

    +

    Writing frontend

    +
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Streaming logs with Centrifugo and Loki</title>
    </head>
    <body>
    <div id="app">
    <form id="input" onsubmit="subscribeToLogs(event)">
    <input type="text" id="query" autocomplete="off" placeholder="Enter log query" />
    <button id="submit" type="submit">SUBSCRIBE</button>
    </form>
    <div id="logs" style="margin-top: 20px;">
    <ul id="lines"></ul>
    </div>
    </div>
    <script src="https://unpkg.com/centrifuge@^5/dist/centrifuge.js"></script>
    <script src="app.js"></script>
    </body>
    </html>
    +

    In the final version we've also included some CSS to this HTML to make it look nicer.

    +

    And our Javascript code in app.js:

    +
    const logs = document.getElementById('logs');
    const lines = document.getElementById('lines');
    const queryInput = document.getElementById('query');
    const button = document.getElementById('submit');

    function subscribeToLogs(e) {
    e.preventDefault();

    const query = queryInput.value;
    if (!query) {
    alert('Please enter a query.');
    return;
    }
    queryInput.disabled = true;
    button.disabled = true;

    const centrifuge = new Centrifuge('ws://localhost:9000/connection/websocket');

    const subscription = centrifuge.newSubscription('logs:stream', {
    data: { query: query }
    });

    subscription.on('publication', function(ctx) {
    const logLine = ctx.data.line;
    const logItem = document.createElement('li');
    logItem.textContent = logLine;
    lines.appendChild(logItem);
    logs.scrollTop = logs.scrollHeight;
    });

    subscription.subscribe();
    centrifuge.connect();
    }
    +

    In the final example we've also added Nginx container to serve static files and proxy WebSocket connections to Centrifugo. Check it out in the source code.

    +

    When user enters Loki query to input, subscription goes to Centrifugo and Centrifugo then realizes it's a proxy stream subscription. So it calls the backend GRPC endpoint (backend:12000) and expect it to implement unidirectional GRPC stream conract. Let's implement it.

    +

    Handle subscription stream on the Go side

    +

    On your backend, you'll implement a GRPC service that interacts with Loki to tail logs and then re-send them to Centrifugo subscription stream. Let's implement such service. We first need to take Centrifugo proxy.proto definitions. And we will implement SubscribeUnidirectional method from it.

    +

    You need to install protoc, also install plugins for Go and GRPC:

    +
    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
    +

    And then:

    +
    protoc -I ./ proxy.proto --go_out=./ --go-grpc_out=./
    +

    This will generate Protobuf messages and GRPC code. Let's implement our server now:

    +
    const (
    lokiGRPCAddress = "loki:9095"
    )

    type streamerServer struct {
    pb.UnimplementedCentrifugoProxyServer
    lokiQuerierClient logproto.QuerierClient
    }

    type clientData struct {
    Query string `json:"query"`
    }

    func (s *streamerServer) SubscribeUnidirectional(
    req *pb.SubscribeRequest,
    stream pb.CentrifugoProxy_SubscribeUnidirectionalServer,
    ) error {
    var cd clientData
    err := json.Unmarshal(req.Data, &cd)
    if err != nil {
    return fmt.Errorf("error unmarshaling data: %w", err)
    }
    query := &logproto.TailRequest{
    Query: cd.Query,
    }
    ctx, cancel := context.WithCancel(stream.Context())
    defer cancel()

    logStream, err := s.lokiQuerierClient.Tail(ctx, query)
    if err != nil {
    return fmt.Errorf("error querying Loki: %w", err)
    }

    started := time.Now()
    log.Println("unidirectional subscribe called with request", req)
    defer func() {
    log.Println("unidirectional subscribe finished, elapsed", time.Since(started))
    }()
    err = stream.Send(&pb.StreamSubscribeResponse{
    SubscribeResponse: &pb.SubscribeResponse{},
    })
    if err != nil {
    return err
    }

    for {
    select {
    case <-stream.Context().Done():
    return stream.Context().Err()
    default:
    resp, err := logStream.Recv()
    if err != nil {
    return fmt.Errorf("error receiving from Loki stream: %v", err)
    }
    for _, entry := range resp.Stream.Entries {
    line := fmt.Sprintf("%s: %s", entry.Timestamp.Format("2006-01-02T15:04:05.000Z07:00"), entry.Line)
    err = stream.Send(&pb.StreamSubscribeResponse{
    Publication: &pb.Publication{Data: []byte(`{"line":"` + line + `"}`)},
    })
    if err != nil {
    return err
    }
    }
    }
    }
    }

    func main() {
    querierConn, err := grpc.Dial(lokiGRPCAddress, grpc.WithTransportCredentials(insecure.NewCredentials()))
    if err != nil {
    log.Fatalf("failed to dial Loki: %v", err)
    }
    querierClient := logproto.NewQuerierClient(querierConn)

    addr := ":12000"
    lis, err := net.Listen("tcp", addr)
    if err != nil {
    log.Fatalf("failed to listen: %v", err)
    }

    s := grpc.NewServer(grpc.MaxConcurrentStreams(math.MaxUint32))
    pb.RegisterCentrifugoProxyServer(s, &streamerServer{
    lokiQuerierClient: querierClient,
    })

    log.Println("Server listening on", addr)
    if err := s.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %v", err)
    }
    }
    +

    Things to note:

    +
      +
    • Loki also supports GRPC interface to tail logs, so we use it here. We could also use Loki WebSocket endpoint /loki/api/v1/tail but this would mean establishing new connection for every tail operation - with GRPC we can use many concurrent tail requests all multiplexed over a single network connection.
    • +
    • When subscription stream initialized from Centrifugo side we start tailing logs from Loki and resend them to Centrifugo
    • +
    • Centrifugo then packs data to WebSocket connection and delivers to browser.
    • +
    +

    Conclusion

    +

    Subscription streams may be a very powerful generic feature in your arsenal. Here we've shown how simple it could be to make a proof of concept of the real-time application which consumes individual data from third-party streaming provider.

    +

    Centrifugo provides WebSocket SDKs for popular languages used to build UI layer, provides authentication and proper management of real-time connections. And with subscription streams feature Centrifugo gives you an answer on how to quickly translate real-time data based on individual query to user.

    ]]>
    + + Alexander Emelin + + + + + <![CDATA[Discovering Centrifugo PRO: push notifications API]]> https://centrifugal.dev/blog/2023/10/29/discovering-centrifugo-pro-push-notifications diff --git a/blog/feed.json b/blog/feed.json index 3c2026831..af206dce1 100644 --- a/blog/feed.json +++ b/blog/feed.json @@ -3,6 +3,22 @@ "title": "", "home_page_url": "https://centrifugal.dev/blog", "items": [ + { + "id": "https://centrifugal.dev/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions", + "content_html": "\n

    As of version 5.1.0, Centrifugo introduces an experimental yet powerful extension that promises to simplify the data delivery process to the browser using GRPC streams. We believe it may help you to solve some practical tasks in minutes. Let's dive into how this feature works and how you can leverage it in your applications integrating with Loki real-time log streaming capabilities.

    \n

    What Are Proxy Subscription Streams?

    \n

    Proxy Subscription Streams support pushing data directly to Centrifugo client channel subscriptions from your application backend over GRPC streams. This feature is designed to facilitate individual data streams to clients as soon as they subscribe to a channel, acting as a bridge between WebSocket connections from clients and GRPC streams to the backend. It supports both unidirectional (backend to client) and bidirectional (both ways) streams, thereby enhancing flexibility in data streaming.

    \n

    \n

    Establishing a stream between Centrifugo and your application backend upon a channel subscription provides a straightforward path for data to travel directly to the subscribed clients. This mechanism not only simplifies the architecture for real-time data delivery but also ensures fast and individualized data streaming.

    \n

    The design is inspired by Websocketd server – but while Websocketd transforms data from programs running locally, Centrifugo provides a more generic network interface with GRPC. And all other features of Centrifugo like connection authentication, online presence come as a great bonus.

    \n

    In the documentation for Proxy Subscription Streams we mentioned streaming logs from Loki as one of the possible use cases. Let's expand on the idea and implement the working solution in just 10 minutes.

    \n

    Demo and source code

    \n

    Here is a demo of what we well get:

    \n\n

    Take a look at full source code on Github.

    \n

    Setting Up Loki

    \n

    Loki is a horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. It is designed to be very cost-effective and easy to operate, making it a perfect candidate for our real-time log streaming example.

    \n

    We will build the example using Docker Compose, all we have to do for the example is to include Loki image to docker-compose.yml:

    \n
    services:
    loki:
    image: grafana/loki:latest
    ports:
    - \"3100:3100\"
    \n

    Loki can ingest logs via various methods, including Promtail, Grafana Agent, Fluentd, and more. For simplicity, we will send logs to Loki ourselves from the Go application.

    \n

    To send logs to Loki, we can use the HTTP API that Loki provides. This is a straightforward way to push logs directly from an application. The example below demonstrates how to create a simple Go application that generates logs and sends them to Loki using HTTP POST requests.

    \n

    First, define a function to send a log entry to Loki:

    \n
    const (
    \tlokiPushEndpoint = \"http://loki:3100/loki/api/v1/push\"
    )

    type lokiPushMessage struct {
    \tStreams []lokiStream `json:\"streams\"`
    }

    type lokiStream struct {
    \tStream map[string]string `json:\"stream\"`
    \tValues [][]string `json:\"values\"`
    }

    func sendLogMessageToLoki(_ context.Context) error {
    \tsources := []string{\"backend1\", \"backend2\", \"backend3\"}
    \tsource := sources[rand.Intn(len(sources))]
    \tlogMessage := fmt.Sprintf(\"log from %s source\", source)

    \tpayload := lokiPushMessage{
    \t\tStreams: []lokiStream{
    \t\t\t{
    \t\t\t\tStream: map[string]string{
    \t\t\t\t\t\"source\": source,
    \t\t\t\t},
    \t\t\t\tValues: [][]string{
    \t\t\t\t\t{fmt.Sprintf(\"%d\", time.Now().UnixNano()), logMessage},
    \t\t\t\t},
    \t\t\t},
    \t\t},
    \t}

    \tjsonData, err := json.Marshal(payload)
    \tif err != nil {
    \t\treturn err
    \t}
    \tresp, err := http.Post(
    \t\tlokiPushEndpoint, \"application/json\", bytes.NewBuffer(jsonData))
    \tif err != nil {
    \t\treturn err
    \t}
    \tdefer resp.Body.Close()

    \tif resp.StatusCode != http.StatusNoContent {
    \t\treturn fmt.Errorf(\"unexpected status code: %d\", resp.StatusCode)
    \t}
    \treturn nil
    }

    func sendLogsToLoki(ctx context.Context) {
    \tfor {
    \t\tselect {
    \t\tcase <-ctx.Done():
    \t\t\treturn
    \t\tcase <-time.After(200 * time.Millisecond):
    \t\t\terr := sendLogMessageToLoki(ctx)
    \t\t\tif err != nil {
    \t\t\t\tlog.Println(\"error sending log to Loki:\", err)
    \t\t\t\tcontinue
    \t\t\t}
    \t\t}
    \t}
    }

    func main() {
    \tctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)
    \tdefer cancel()

    \tsendLogsToLoki(ctx)
    }
    \n

    This program defines a sendLogsToLoki function that constructs a log entry and sends it to Loki using its HTTP API. It continuously generates log messages every 200 milliseconds.

    \n

    The lokiPushMessage struct is structured to match the JSON payload expected by Loki's /loki/api/v1/push endpoint. Each log entry consists of a set of labels (in the Stream map) and log line values, where each value is a two-element array containing the timestamp and the log line. The timestamp is in nanoseconds to match Loki's expected format.

    \n

    Note, in the example we randomly set log entry source label choosing between backend1, backend2 and backend3 values.

    \n

    At this point our program pushes some logs to Loki, now let's add Centrifugo to consume them from browser in real-time.

    \n

    Configuring Centrifugo

    \n

    Adding Centrifugo is also rather straightforward:

    \n
    services:
    centrifugo:
    image: centrifugo/centrifugo:v5.3.0
    restart: unless-stopped
    volumes:
    - ./centrifugo/config.json:/centrifugo/config.json
    command: centrifugo -c config.json
    expose:
    - 8000
    \n

    Where config.json is:

    \n
    {
    \"client_insecure\": true,
    \"allowed_origins\": [\"http://localhost:9000\"],
    \"proxy_subscribe_stream_endpoint\": \"grpc://backend:12000\",
    \"proxy_subscribe_stream_timeout\": \"3s\",
    \"namespaces\": [
    {
    \"name\": \"logs\",
    \"proxy_subscribe_stream\": true
    }
    ]
    }
    \n

    Note, we enabled client_insecure option here – this is to keep example short, but in real live you may benefit from Centrifugo authentication: JWT-based or proxy-based.

    \n

    Writing frontend

    \n
    <!DOCTYPE html>
    <html lang=\"en\">
    <head>
    <meta charset=\"UTF-8\">
    <title>Streaming logs with Centrifugo and Loki</title>
    </head>
    <body>
    <div id=\"app\">
    <form id=\"input\" onsubmit=\"subscribeToLogs(event)\">
    <input type=\"text\" id=\"query\" autocomplete=\"off\" placeholder=\"Enter log query\" />
    <button id=\"submit\" type=\"submit\">SUBSCRIBE</button>
    </form>
    <div id=\"logs\" style=\"margin-top: 20px;\">
    <ul id=\"lines\"></ul>
    </div>
    </div>
    <script src=\"https://unpkg.com/centrifuge@^5/dist/centrifuge.js\"></script>
    <script src=\"app.js\"></script>
    </body>
    </html>
    \n

    In the final version we've also included some CSS to this HTML to make it look nicer.

    \n

    And our Javascript code in app.js:

    \n
    const logs = document.getElementById('logs');
    const lines = document.getElementById('lines');
    const queryInput = document.getElementById('query');
    const button = document.getElementById('submit');

    function subscribeToLogs(e) {
    e.preventDefault();

    const query = queryInput.value;
    if (!query) {
    alert('Please enter a query.');
    return;
    }
    queryInput.disabled = true;
    button.disabled = true;

    const centrifuge = new Centrifuge('ws://localhost:9000/connection/websocket');

    const subscription = centrifuge.newSubscription('logs:stream', {
    data: { query: query }
    });

    subscription.on('publication', function(ctx) {
    const logLine = ctx.data.line;
    const logItem = document.createElement('li');
    logItem.textContent = logLine;
    lines.appendChild(logItem);
    logs.scrollTop = logs.scrollHeight;
    });

    subscription.subscribe();
    centrifuge.connect();
    }
    \n

    In the final example we've also added Nginx container to serve static files and proxy WebSocket connections to Centrifugo. Check it out in the source code.

    \n

    When user enters Loki query to input, subscription goes to Centrifugo and Centrifugo then realizes it's a proxy stream subscription. So it calls the backend GRPC endpoint (backend:12000) and expect it to implement unidirectional GRPC stream conract. Let's implement it.

    \n

    Handle subscription stream on the Go side

    \n

    On your backend, you'll implement a GRPC service that interacts with Loki to tail logs and then re-send them to Centrifugo subscription stream. Let's implement such service. We first need to take Centrifugo proxy.proto definitions. And we will implement SubscribeUnidirectional method from it.

    \n

    You need to install protoc, also install plugins for Go and GRPC:

    \n
    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
    \n

    And then:

    \n
    protoc -I ./ proxy.proto --go_out=./ --go-grpc_out=./
    \n

    This will generate Protobuf messages and GRPC code. Let's implement our server now:

    \n
    const (
    \tlokiGRPCAddress = \"loki:9095\"
    )

    type streamerServer struct {
    \tpb.UnimplementedCentrifugoProxyServer
    \tlokiQuerierClient logproto.QuerierClient
    }

    type clientData struct {
    \tQuery string `json:\"query\"`
    }

    func (s *streamerServer) SubscribeUnidirectional(
    \treq *pb.SubscribeRequest,
    \tstream pb.CentrifugoProxy_SubscribeUnidirectionalServer,
    ) error {
    \tvar cd clientData
    \terr := json.Unmarshal(req.Data, &cd)
    \tif err != nil {
    \t\treturn fmt.Errorf(\"error unmarshaling data: %w\", err)
    \t}
    \tquery := &logproto.TailRequest{
    \t\tQuery: cd.Query,
    \t}
    \tctx, cancel := context.WithCancel(stream.Context())
    \tdefer cancel()

    \tlogStream, err := s.lokiQuerierClient.Tail(ctx, query)
    \tif err != nil {
    \t\treturn fmt.Errorf(\"error querying Loki: %w\", err)
    \t}

    \tstarted := time.Now()
    \tlog.Println(\"unidirectional subscribe called with request\", req)
    \tdefer func() {
    \t\tlog.Println(\"unidirectional subscribe finished, elapsed\", time.Since(started))
    \t}()
    \terr = stream.Send(&pb.StreamSubscribeResponse{
    \t\tSubscribeResponse: &pb.SubscribeResponse{},
    \t})
    \tif err != nil {
    \t\treturn err
    \t}

    \tfor {
    \t\tselect {
    \t\tcase <-stream.Context().Done():
    \t\t\treturn stream.Context().Err()
    \t\tdefault:
    \t\t\tresp, err := logStream.Recv()
    \t\t\tif err != nil {
    \t\t\t\treturn fmt.Errorf(\"error receiving from Loki stream: %v\", err)
    \t\t\t}
    \t\t\tfor _, entry := range resp.Stream.Entries {
    \t\t\t\tline := fmt.Sprintf(\"%s: %s\", entry.Timestamp.Format(\"2006-01-02T15:04:05.000Z07:00\"), entry.Line)
    \t\t\t\terr = stream.Send(&pb.StreamSubscribeResponse{
    \t\t\t\t\tPublication: &pb.Publication{Data: []byte(`{\"line\":\"` + line + `\"}`)},
    \t\t\t\t})
    \t\t\t\tif err != nil {
    \t\t\t\t\treturn err
    \t\t\t\t}
    \t\t\t}
    \t\t}
    \t}
    }

    func main() {
    \tquerierConn, err := grpc.Dial(lokiGRPCAddress, grpc.WithTransportCredentials(insecure.NewCredentials()))
    \tif err != nil {
    \t\tlog.Fatalf(\"failed to dial Loki: %v\", err)
    \t}
    \tquerierClient := logproto.NewQuerierClient(querierConn)

    \taddr := \":12000\"
    \tlis, err := net.Listen(\"tcp\", addr)
    \tif err != nil {
    \t\tlog.Fatalf(\"failed to listen: %v\", err)
    \t}

    \ts := grpc.NewServer(grpc.MaxConcurrentStreams(math.MaxUint32))
    \tpb.RegisterCentrifugoProxyServer(s, &streamerServer{
    \t\tlokiQuerierClient: querierClient,
    \t})

    \tlog.Println(\"Server listening on\", addr)
    \tif err := s.Serve(lis); err != nil {
    \t\tlog.Fatalf(\"failed to serve: %v\", err)
    \t}
    }
    \n

    Things to note:

    \n
      \n
    • Loki also supports GRPC interface to tail logs, so we use it here. We could also use Loki WebSocket endpoint /loki/api/v1/tail but this would mean establishing new connection for every tail operation - with GRPC we can use many concurrent tail requests all multiplexed over a single network connection.
    • \n
    • When subscription stream initialized from Centrifugo side we start tailing logs from Loki and resend them to Centrifugo
    • \n
    • Centrifugo then packs data to WebSocket connection and delivers to browser.
    • \n
    \n

    Conclusion

    \n

    Subscription streams may be a very powerful generic feature in your arsenal. Here we've shown how simple it could be to make a proof of concept of the real-time application which consumes individual data from third-party streaming provider.

    \n

    Centrifugo provides WebSocket SDKs for popular languages used to build UI layer, provides authentication and proper management of real-time connections. And with subscription streams feature Centrifugo gives you an answer on how to quickly translate real-time data based on individual query to user.

    ", + "url": "https://centrifugal.dev/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions", + "title": "Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions", + "summary": "Centrifugo has GRPC subscription streams feature, in this post we show how this feature may simplify a task of delivering data to application UI in real-time. We integrate with Loki, injest log entries and stream logs to the browser based on user-supplied query", + "date_modified": "2024-03-18T00:00:00.000Z", + "author": { + "name": "Alexander Emelin" + }, + "tags": [ + "centrifugo", + "loki", + "grpc" + ] + }, { "id": "https://centrifugal.dev/blog/2023/10/29/discovering-centrifugo-pro-push-notifications", "content_html": "\n

    In our v5 release post, we announced the upcoming launch of Centrifugo PRO. We are happy to say that it was released soon after that, and at this point, we already have several customers of the PRO version.

    \n

    I think it's time to look at the current state of the PRO version and finally start talking more about its benefits. In this post, we will talk more about one of the coolest PRO features we have at this point: the push notifications API.

    \n

    Centrifugo PRO goals

    \n

    When Centrifugo was originally created, its main goal was to help introduce real-time messaging features to existing systems, written in traditional frameworks which work on top of the worker/thread model. Serving many concurrent connections is a non-trivial task in general, and without native efficient concurrency support, it becomes mostly impossible without a shift in the technology stack. Integrating with Centrifugo makes it simple to introduce an efficient real-time layer, while keeping the existing application architecture.

    \n

    As time went on, Centrifugo got some unique features which now justify its usage even in conjunction with languages/frameworks with good concurrency support. Simply using Centrifugo for at-most-once PUB/SUB may already save a lot of development time. The task, which seems trivial at first glance, has a lot of challenges in practice: client SDKs with reconnect and channel multiplexing, scalability to many nodes, WebSocket fallbacks, etc.

    \n

    The combination of useful possibilities has made Centrifugo an attractive component for building enterprise-level applications. Let's be honest here - for pet projects, developers often prefer writing WebSocket communications themselves, and Centrifugo may be too heavy and an extra dependency. But in a corporate environment, the decision on which technology to use should take into account a lot of factors, like those we just mentioned above. Using a mature technology is often preferred to building from scratch and making all the mistakes along the way.

    \n

    With the PRO version, our goal is to provide even more value for established businesses when switching to Centrifugo. We want to solve tricky cases and simplify them for our customers; we want to step into related areas where we see we can provide sufficient value.

    \n

    One rule we try to follow for PRO features that extend Centrifugo’s scope is this: we are not trying to replicate something that already exists in other systems, but rather, we strive to improve upon it. We focus on solving practical issues that we observe, providing a unique value proposition for our customers. This post describes one such example — we will demonstrate our approach to push notifications, which is one the features of Centrifugo PRO.

    \n

    Why providing push notifications API

    \n\n

    Why provide a push notifications API at all? Well, actually, real-time messages and push notifications are so close that many developers hardly see the difference before starting to work with both more closely.

    \n

    I’ve heard several stories where chat functionality on mobile devices was implemented using only native push notifications — without using a separate real-time transport like WebSocket while the app is in the foreground. While this is not a recommended approach due to the delivery properties of push notifications, it proves that real-time messages and push notifications are closely related concepts and sometimes may interchange with each other.

    \n

    When developers introduce WebSocket communication in an application, they often ask the question—what should I do next to deliver some important messages to a user who is currently not actively using the application? WebSockets are great when the app is in the foreground, but when the app goes to the background, the recommended approach is to close the WebSocket connection. This is important to save battery, and operating systems force the closing of connections after some time anyway.

    \n

    The delivery of important app data is then possible over push notifications. See a good overview of them on web.dev.

    \n

    Previously, Centrifugo positioned itself solely as a transport layer for real-time messages. In our FAQ, we emphasized this fact and suggested using separate software products to send push notifications.

    \n

    Now, with Centrifugo PRO, we provide this functionality to our customers. We have extended our server API with methods to manage and send push notifications. I promised to tell you why we believe our implementation is super cool. Let’s dive into the details.

    \n

    Push notifications API like no one provides

    \n

    Push notifications are super handy, but there’s a bit to do to get them working right. Let's break it down!

    \n

    On the user's side (frontend)

    \n
      \n
    • Request permission from the user to receive push notifications.
    • \n
    • Integrate with the platform-specific notification service (e.g., Apple Push Notification Service for iOS, Firebase Cloud Messaging for Android) to obtain the device token.
    • \n
    • Send the device token to the server for storage and future use.
    • \n
    • Integrate with the platform-specific notification handler to listen for incoming push notifications
    • \n
    • Handle incoming push notifications: display the notification content to the user, either as a banner, alert, or in-app message, depending on the user's preferences and the type of notification. Handle user actions on the notification, such as opening the app, dismissing the notification, or taking a specific action related to the notification content.
    • \n
    \n

    On the server (backend)

    \n
      \n
    • Store device tokens in a database when received from the client side
    • \n
    • Regularly clean up the database to remove stale or invalid device tokens. and handle scenarios where a device token becomes invalid or is revoked by the user, ensuring that no further notifications are sent to that device.
    • \n
    • Integrate with platform-specific notification services (e.g., APNS, FCM) to send notifications to devices. Handle errors or failures in sending notifications and implement retry mechanisms if necessary.
    • \n
    • Track the delivery status of each push notification sent out. Monitor the open rates, click-through rates, and other relevant metrics for the notifications.
    • \n
    • Use analytics to understand user behavior in response to notifications and refine the notification strategy based on insights gained.
    • \n
    \n

    We believe that we were able to achieve a unique combination of design decisions which allows us to provide push notification support like no one else provides. Let’s dive into what makes our approach special!

    \n

    Frontend decisions

    \n

    When providing the push notification feature, other solutions like Pusher or Ably also offer their own SDKs for managing notifications on the client side.

    \n

    What we've learned, though, during the Centrifugo life cycle, is that creating and maintaining client SDKs for various environments (iOS, Android, Web, Flutter) is one of the hardest parts of the Centrifugo project.

    \n

    So the decision here was simple and natural: Centrifugo PRO does not introduce any client SDKs for push notifications on the client side.

    \n

    When integrating with Centrifugo, you can simply use the native SDKs provided by each platform. We bypass the complexities of SDK development and concentrate on server-side improvements. With this decision, we are not introducing any limitations to the client side.

    \n

    You get:

    \n
      \n
    • Wealthy documentation and community support. Platforms like APNs provide comprehensive documentation, tutorials, and best practices, making the integration process smoother.
    • \n
    • Stability and reliability: native SDKs are rigorously tested and frequently updated by the platform providers. This ensures that they are stable, reliable, and free from critical bugs.
    • \n
    • Access to the latest features. As platform providers roll out new features or enhancements, native SDKs are usually the first to get updated. This ensures that your application can leverage the latest functionalities without waiting for SDKs to catch up.
    • \n
    \n

    This approach was not possible with our real-time SDKs, as WebSocket communication is very low-level, and Centrifugo’s main goal was to provide some high-level features on top of it. However, with push notifications, proceeding without a custom SDK seems like a choice beneficial for everyone.

    \n

    Server implementation

    \n

    The main work we did was on the server side. Let's go through the entire workflow of push notification delivery and describe what Centrifugo PRO provides for each step.

    \n

    How we keep tokens

    \n

    Let's suppose you got the permission from the user and received the device push token. At this point you must save it to database for sending notifications later using this token. Centrifugo PRO provides API called device_register to do exactly this.

    \n

    At this point, we use PostgreSQL for storing tokens – which is a very popular SQL database. Probably we will add more storage backend options in the future.

    \n

    When calling Centrifugo device_register API you can provide user ID, list of topics to subscribe, platform from which the user came from (ios, android, web), also push notifications provider. To deliver push notifications to devices Centrifugo PRO integrates with the following push notification providers:

    \n\n

    \"Push\"

    \n

    So we basically cover all the most popular platforms out of the box.

    \n

    After registering the device token, Centrifugo PRO returns a device_id to you. This device ID must be stored on the client device. As long as the frontend has this device_id, it can update the device's push token information from time to time to keep it current (by just calling device_register again, but with device_id attached).

    \n

    After saving the token, your backend can start sending push notifications to devices.

    \n

    How we send notifications

    \n

    To send push notifications we provide another API called send_push_notification. You need to provide some filter in the API request to tell Centrifugo who you want to send notification. You also need to provide push notification payload. For example, using Centrifugo HTTP API:

    \n
    curl -X POST http://localhost:8000/api/send_push_notification \\
    -H \"Authorization: apikey <KEY>\" \\
    -d @- <<'EOF'

    {
    \"recipient\": {
    \"filter\": {
    \"topics\": [\"test\"]
    }
    },
    \"notification\": {
    \"fcm\": {
    \"message\": {
    \"notification\": {\"title\": \"Hello\", \"body\": \"How are you?\"}
    }
    }
    }
    }
    EOF
    \n

    Here is another important decision we made: Centrifugo PRO allows you to specify raw JSON objects for each provider we support. In other words, we do not wrap the push notifications API for FCM, APNS, HMS - we give you a way to construct the entire push notification message.

    \n

    This means the Centrifugo push API supports all the fields of push notification payloads out-of-the-box, for all push providers. You can simply use the documentation of FCM, APNs, and send the constructed requests to Centrifugo. There is no need for us to update Centrifugo PRO in any way to support new fields added by providers to push APIs.

    \n

    When you send a push notification with a filter and push payload for each provider you want, it's queued by Centrifugo. We use Redis Streams for queuing and optionally a queue based on PostgreSQL (less efficient, but still robust enough).

    \n

    The fact that the notification is being queued means a very fast response time – so you can integrate with Centrifugo from within the hot paths of your application backend. You may additionally provide a push expiration time and a unique push identifier. If you have not provided a unique identifier, Centrifugo generates one for you and returns it in the response. The unique identifier may later be used to track push status in Centrifugo PRO's push notification analytics.

    \n

    We then have efficient workers which process the queue with minimal latency and send push notifications using batch requests for each provider - i.e., we do this in the most effective way possible. We conducted a benchmark of our worker system with FCM – and we can easily send several million pushes per minute.

    \n

    Another decision we made - Centrifugo PRO supports sending push notifications to a raw list of tokens. This makes it possible for our customers to use their own token storage. For example, such storage could already exist before you started using Centrifugo, or you might need a different storage/schema. In such cases, you can use Centrifugo just as an effective push sender server.

    \n

    Finally, Centrifugo PRO supports sending delayed push notification - to queue push for a later delivery, so for example you can send notification based on user time zone and let Centrifugo PRO send it when needed. Or you may send slightly delayed push notification together with real-time message and if client provided an ack to real-time message - cancel push notification.

    \n

    Secure unified topics

    \n

    FCM and HMS have a built-in way of sending notification to large groups of devices over topics mechanism (the same for HMS). One problem with native FCM or HMS topics though is that device can subscribe to any topic from the frontend side without any permission check. In today's world this is usually not desired. So Centrifugo PRO re-implements FCM and HMS topics by introducing an additional API to manage device subscriptions to topics.

    \n

    Centrifugo PRO device topic subscriptions also add a way to introduce the missing topic semantics for APNs.

    \n

    Centrifugo PRO additionally provides an API to create persistent bindings of user to notification topics. See user_topic_list and user_topic_update. As soon as user registers a device – it will be automatically subscribed to its own topics pre-created over the API. As soon as user logs out from the app and you update user ID of the device - user topics binded to the device automatically removed/switched.

    \n

    This design solves one of the issues with push notifications (with FCM in particular) – if two different users use the same device it's becoming problematic to unsubscribe the device from large number of topics upon logout. Also, as soon as user to topic binding added (using user_topic_update API) – it will be synchronized across all user active devices. You can still manage such persistent subscriptions on the application backend side if you prefer and provide the full list inside device_register call - Centrifugo PRO API gives you freedom here.

    \n

    Push analytics

    \n

    Centrifugo PRO offers the ability to inspect sent push notifications using ClickHouse analytics. Push providers may also offer their own analytics, such as FCM, which provides insight into push notification delivery. Centrifugo PRO also offers a way to analyze push notification delivery and interaction using the update_push_status API. This API allows updating ClickHouse table and add status for each push sent:

    \n
      \n
    • delivered
    • \n
    • or interacted
    • \n
    \n

    It's then possible to make queries to ClickHouse and build various analytical reports. Or use ClickHouse for real-time graphs - for example, from Grafana.

    \n

    Push notifications UI

    \n

    Finally, Centrifugo PRO provides a simple web UI for inspecting registered devices. It can simplify development, provide a way to look at live data, and send simple push notification alerts to users or topics.

    \n

    \n

    Conclusion

    \n

    We really believe in our push notifications and will be working hard to make them even better. The API we already have serves well to cover common push notification delivery use cases, but we won't stop here. Some areas for improvements are: functionality of built-in push notifications web UI, extending push analytics by providing user friendly UI for the insights about push delivery and engagement. The good thing is that we already have a ground for making this.

    \n

    Take a look at the documentation of Centrifugo PRO push notification API for more formal details and some things not mentioned here. Probably at the time you are reading this we already added something great to the API.

    \n

    Even though Centrifugo PRO is pretty new, it already has a lot of helpful features, and we have plans to add even more. You can see what’s coming up next on our Centrifugo PRO planned features board. We're excited to share more blog posts like this one in the future.

    ", diff --git a/blog/rss.xml b/blog/rss.xml index 2dc01f853..0df0d425c 100644 --- a/blog/rss.xml +++ b/blog/rss.xml @@ -4,11 +4,75 @@ https://centrifugal.dev/blog - Sun, 29 Oct 2023 00:00:00 GMT + Mon, 18 Mar 2024 00:00:00 GMT https://validator.w3.org/feed/docs/rss2.html https://github.com/jpmonette/feed en Centrifugal Labs LTD + + <![CDATA[Stream logs from Loki to browser with Centrifugo Websocket-to-GRPC subscriptions]]> + https://centrifugal.dev/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions + https://centrifugal.dev/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptions + Mon, 18 Mar 2024 00:00:00 GMT + + +

    As of version 5.1.0, Centrifugo introduces an experimental yet powerful extension that promises to simplify the data delivery process to the browser using GRPC streams. We believe it may help you to solve some practical tasks in minutes. Let's dive into how this feature works and how you can leverage it in your applications integrating with Loki real-time log streaming capabilities.

    +

    What Are Proxy Subscription Streams?

    +

    Proxy Subscription Streams support pushing data directly to Centrifugo client channel subscriptions from your application backend over GRPC streams. This feature is designed to facilitate individual data streams to clients as soon as they subscribe to a channel, acting as a bridge between WebSocket connections from clients and GRPC streams to the backend. It supports both unidirectional (backend to client) and bidirectional (both ways) streams, thereby enhancing flexibility in data streaming.

    +

    +

    Establishing a stream between Centrifugo and your application backend upon a channel subscription provides a straightforward path for data to travel directly to the subscribed clients. This mechanism not only simplifies the architecture for real-time data delivery but also ensures fast and individualized data streaming.

    +

    The design is inspired by Websocketd server – but while Websocketd transforms data from programs running locally, Centrifugo provides a more generic network interface with GRPC. And all other features of Centrifugo like connection authentication, online presence come as a great bonus.

    +

    In the documentation for Proxy Subscription Streams we mentioned streaming logs from Loki as one of the possible use cases. Let's expand on the idea and implement the working solution in just 10 minutes.

    +

    Demo and source code

    +

    Here is a demo of what we well get:

    + +

    Take a look at full source code on Github.

    +

    Setting Up Loki

    +

    Loki is a horizontally-scalable, highly-available, multi-tenant log aggregation system inspired by Prometheus. It is designed to be very cost-effective and easy to operate, making it a perfect candidate for our real-time log streaming example.

    +

    We will build the example using Docker Compose, all we have to do for the example is to include Loki image to docker-compose.yml:

    +
    services:
    loki:
    image: grafana/loki:latest
    ports:
    - "3100:3100"
    +

    Loki can ingest logs via various methods, including Promtail, Grafana Agent, Fluentd, and more. For simplicity, we will send logs to Loki ourselves from the Go application.

    +

    To send logs to Loki, we can use the HTTP API that Loki provides. This is a straightforward way to push logs directly from an application. The example below demonstrates how to create a simple Go application that generates logs and sends them to Loki using HTTP POST requests.

    +

    First, define a function to send a log entry to Loki:

    +
    const (
    lokiPushEndpoint = "http://loki:3100/loki/api/v1/push"
    )

    type lokiPushMessage struct {
    Streams []lokiStream `json:"streams"`
    }

    type lokiStream struct {
    Stream map[string]string `json:"stream"`
    Values [][]string `json:"values"`
    }

    func sendLogMessageToLoki(_ context.Context) error {
    sources := []string{"backend1", "backend2", "backend3"}
    source := sources[rand.Intn(len(sources))]
    logMessage := fmt.Sprintf("log from %s source", source)

    payload := lokiPushMessage{
    Streams: []lokiStream{
    {
    Stream: map[string]string{
    "source": source,
    },
    Values: [][]string{
    {fmt.Sprintf("%d", time.Now().UnixNano()), logMessage},
    },
    },
    },
    }

    jsonData, err := json.Marshal(payload)
    if err != nil {
    return err
    }
    resp, err := http.Post(
    lokiPushEndpoint, "application/json", bytes.NewBuffer(jsonData))
    if err != nil {
    return err
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusNoContent {
    return fmt.Errorf("unexpected status code: %d", resp.StatusCode)
    }
    return nil
    }

    func sendLogsToLoki(ctx context.Context) {
    for {
    select {
    case <-ctx.Done():
    return
    case <-time.After(200 * time.Millisecond):
    err := sendLogMessageToLoki(ctx)
    if err != nil {
    log.Println("error sending log to Loki:", err)
    continue
    }
    }
    }
    }

    func main() {
    ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGTERM, syscall.SIGINT)
    defer cancel()

    sendLogsToLoki(ctx)
    }
    +

    This program defines a sendLogsToLoki function that constructs a log entry and sends it to Loki using its HTTP API. It continuously generates log messages every 200 milliseconds.

    +

    The lokiPushMessage struct is structured to match the JSON payload expected by Loki's /loki/api/v1/push endpoint. Each log entry consists of a set of labels (in the Stream map) and log line values, where each value is a two-element array containing the timestamp and the log line. The timestamp is in nanoseconds to match Loki's expected format.

    +

    Note, in the example we randomly set log entry source label choosing between backend1, backend2 and backend3 values.

    +

    At this point our program pushes some logs to Loki, now let's add Centrifugo to consume them from browser in real-time.

    +

    Configuring Centrifugo

    +

    Adding Centrifugo is also rather straightforward:

    +
    services:
    centrifugo:
    image: centrifugo/centrifugo:v5.3.0
    restart: unless-stopped
    volumes:
    - ./centrifugo/config.json:/centrifugo/config.json
    command: centrifugo -c config.json
    expose:
    - 8000
    +

    Where config.json is:

    +
    {
    "client_insecure": true,
    "allowed_origins": ["http://localhost:9000"],
    "proxy_subscribe_stream_endpoint": "grpc://backend:12000",
    "proxy_subscribe_stream_timeout": "3s",
    "namespaces": [
    {
    "name": "logs",
    "proxy_subscribe_stream": true
    }
    ]
    }
    +

    Note, we enabled client_insecure option here – this is to keep example short, but in real live you may benefit from Centrifugo authentication: JWT-based or proxy-based.

    +

    Writing frontend

    +
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Streaming logs with Centrifugo and Loki</title>
    </head>
    <body>
    <div id="app">
    <form id="input" onsubmit="subscribeToLogs(event)">
    <input type="text" id="query" autocomplete="off" placeholder="Enter log query" />
    <button id="submit" type="submit">SUBSCRIBE</button>
    </form>
    <div id="logs" style="margin-top: 20px;">
    <ul id="lines"></ul>
    </div>
    </div>
    <script src="https://unpkg.com/centrifuge@^5/dist/centrifuge.js"></script>
    <script src="app.js"></script>
    </body>
    </html>
    +

    In the final version we've also included some CSS to this HTML to make it look nicer.

    +

    And our Javascript code in app.js:

    +
    const logs = document.getElementById('logs');
    const lines = document.getElementById('lines');
    const queryInput = document.getElementById('query');
    const button = document.getElementById('submit');

    function subscribeToLogs(e) {
    e.preventDefault();

    const query = queryInput.value;
    if (!query) {
    alert('Please enter a query.');
    return;
    }
    queryInput.disabled = true;
    button.disabled = true;

    const centrifuge = new Centrifuge('ws://localhost:9000/connection/websocket');

    const subscription = centrifuge.newSubscription('logs:stream', {
    data: { query: query }
    });

    subscription.on('publication', function(ctx) {
    const logLine = ctx.data.line;
    const logItem = document.createElement('li');
    logItem.textContent = logLine;
    lines.appendChild(logItem);
    logs.scrollTop = logs.scrollHeight;
    });

    subscription.subscribe();
    centrifuge.connect();
    }
    +

    In the final example we've also added Nginx container to serve static files and proxy WebSocket connections to Centrifugo. Check it out in the source code.

    +

    When user enters Loki query to input, subscription goes to Centrifugo and Centrifugo then realizes it's a proxy stream subscription. So it calls the backend GRPC endpoint (backend:12000) and expect it to implement unidirectional GRPC stream conract. Let's implement it.

    +

    Handle subscription stream on the Go side

    +

    On your backend, you'll implement a GRPC service that interacts with Loki to tail logs and then re-send them to Centrifugo subscription stream. Let's implement such service. We first need to take Centrifugo proxy.proto definitions. And we will implement SubscribeUnidirectional method from it.

    +

    You need to install protoc, also install plugins for Go and GRPC:

    +
    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
    +

    And then:

    +
    protoc -I ./ proxy.proto --go_out=./ --go-grpc_out=./
    +

    This will generate Protobuf messages and GRPC code. Let's implement our server now:

    +
    const (
    lokiGRPCAddress = "loki:9095"
    )

    type streamerServer struct {
    pb.UnimplementedCentrifugoProxyServer
    lokiQuerierClient logproto.QuerierClient
    }

    type clientData struct {
    Query string `json:"query"`
    }

    func (s *streamerServer) SubscribeUnidirectional(
    req *pb.SubscribeRequest,
    stream pb.CentrifugoProxy_SubscribeUnidirectionalServer,
    ) error {
    var cd clientData
    err := json.Unmarshal(req.Data, &cd)
    if err != nil {
    return fmt.Errorf("error unmarshaling data: %w", err)
    }
    query := &logproto.TailRequest{
    Query: cd.Query,
    }
    ctx, cancel := context.WithCancel(stream.Context())
    defer cancel()

    logStream, err := s.lokiQuerierClient.Tail(ctx, query)
    if err != nil {
    return fmt.Errorf("error querying Loki: %w", err)
    }

    started := time.Now()
    log.Println("unidirectional subscribe called with request", req)
    defer func() {
    log.Println("unidirectional subscribe finished, elapsed", time.Since(started))
    }()
    err = stream.Send(&pb.StreamSubscribeResponse{
    SubscribeResponse: &pb.SubscribeResponse{},
    })
    if err != nil {
    return err
    }

    for {
    select {
    case <-stream.Context().Done():
    return stream.Context().Err()
    default:
    resp, err := logStream.Recv()
    if err != nil {
    return fmt.Errorf("error receiving from Loki stream: %v", err)
    }
    for _, entry := range resp.Stream.Entries {
    line := fmt.Sprintf("%s: %s", entry.Timestamp.Format("2006-01-02T15:04:05.000Z07:00"), entry.Line)
    err = stream.Send(&pb.StreamSubscribeResponse{
    Publication: &pb.Publication{Data: []byte(`{"line":"` + line + `"}`)},
    })
    if err != nil {
    return err
    }
    }
    }
    }
    }

    func main() {
    querierConn, err := grpc.Dial(lokiGRPCAddress, grpc.WithTransportCredentials(insecure.NewCredentials()))
    if err != nil {
    log.Fatalf("failed to dial Loki: %v", err)
    }
    querierClient := logproto.NewQuerierClient(querierConn)

    addr := ":12000"
    lis, err := net.Listen("tcp", addr)
    if err != nil {
    log.Fatalf("failed to listen: %v", err)
    }

    s := grpc.NewServer(grpc.MaxConcurrentStreams(math.MaxUint32))
    pb.RegisterCentrifugoProxyServer(s, &streamerServer{
    lokiQuerierClient: querierClient,
    })

    log.Println("Server listening on", addr)
    if err := s.Serve(lis); err != nil {
    log.Fatalf("failed to serve: %v", err)
    }
    }
    +

    Things to note:

    +
      +
    • Loki also supports GRPC interface to tail logs, so we use it here. We could also use Loki WebSocket endpoint /loki/api/v1/tail but this would mean establishing new connection for every tail operation - with GRPC we can use many concurrent tail requests all multiplexed over a single network connection.
    • +
    • When subscription stream initialized from Centrifugo side we start tailing logs from Loki and resend them to Centrifugo
    • +
    • Centrifugo then packs data to WebSocket connection and delivers to browser.
    • +
    +

    Conclusion

    +

    Subscription streams may be a very powerful generic feature in your arsenal. Here we've shown how simple it could be to make a proof of concept of the real-time application which consumes individual data from third-party streaming provider.

    +

    Centrifugo provides WebSocket SDKs for popular languages used to build UI layer, provides authentication and proper management of real-time connections. And with subscription streams feature Centrifugo gives you an answer on how to quickly translate real-time data based on individual query to user.

    ]]>
    + centrifugo + loki + grpc +
    <![CDATA[Discovering Centrifugo PRO: push notifications API]]> https://centrifugal.dev/blog/2023/10/29/discovering-centrifugo-pro-push-notifications diff --git a/blog/tags.html b/blog/tags.html index fbf76f29d..9eb180cf3 100644 --- a/blog/tags.html +++ b/blog/tags.html @@ -15,10 +15,10 @@ - - + + - + \ No newline at end of file diff --git a/blog/tags/authentication.html b/blog/tags/authentication.html index a3cd546d1..d422e87ac 100644 --- a/blog/tags/authentication.html +++ b/blog/tags/authentication.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "authentication"

    View All Tags
    diff --git a/blog/tags/benthos.html b/blog/tags/benthos.html index b6a730b8a..793cb62ca 100644 --- a/blog/tags/benthos.html +++ b/blog/tags/benthos.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "benthos"

    View All Tags
    August 19, 2023 by Alexander Emelin
    In this post, we'll demonstrate how to asynchronously stream messages into Centrifugo channels from external data providers using Benthos tool. We also highlight some pitfalls which become more important in asynchronous publishing scenario.
    diff --git a/blog/tags/centrifuge.html b/blog/tags/centrifuge.html index a1a19f664..6c6853c65 100644 --- a/blog/tags/centrifuge.html +++ b/blog/tags/centrifuge.html @@ -15,8 +15,8 @@ - - + +

    2 posts tagged with "centrifuge"

    View All Tags
    February 10, 2020 by Centrifugal team
    Describing a test stand in Kubernetes where we connect one million websocket connections to a server, using Redis to scale nodes, and providing insights about hardware resources required to achieve 500k messages per second
    diff --git a/blog/tags/centrifugo.html b/blog/tags/centrifugo.html index f4da93b5c..adcf8f1de 100644 --- a/blog/tags/centrifugo.html +++ b/blog/tags/centrifugo.html @@ -3,7 +3,7 @@ -12 posts tagged with "centrifugo" | Centrifugo +13 posts tagged with "centrifugo" | Centrifugo @@ -15,10 +15,10 @@ - - + + -

    12 posts tagged with "centrifugo"

    View All Tags
    October 29, 2023 by Alexander Emelin
    We start talking more about recently launched Centrifugo PRO. In this post, we share details about Centrifugo PRO push notification API implementation - how it works and what makes it special and practical.
    August 29, 2023 by Centrifugal + RabbitX
    In this post, the engineering team of RabbitX platform shares details about the usage of Centrifugo in their product.
    August 19, 2023 by Alexander Emelin
    In this post, we'll demonstrate how to asynchronously stream messages into Centrifugo channels from external data providers using Benthos tool. We also highlight some pitfalls which become more important in asynchronous publishing scenario.
    June 29, 2023 by Centrifugal team
    We are excited to announce a new version of Centrifugo. It's an evolutionary step which makes Centrifugo cleaner and more intuitive to use.
    July 19, 2022 by Centrifugal team
    Centrifugo v4 provides an optimized client protocol, modern WebSocket emulation, improved channel security, redesigned client SDK behavior, experimental HTTP/3 and WebTransport support.
    October 18, 2021 by Alexander Emelin
    In this tutorial we are integrating Centrifugo with NodeJS. We are using Centrifugo connect proxy feature to authenticate connections over standard Express.js session middleware.
    August 31, 2021 by Centrifugal team
    Centrifugo v3 released with lots of exciting improvements
    +

    13 posts tagged with "centrifugo"

    View All Tags
    October 29, 2023 by Alexander Emelin
    We start talking more about recently launched Centrifugo PRO. In this post, we share details about Centrifugo PRO push notification API implementation - how it works and what makes it special and practical.
    August 29, 2023 by Centrifugal + RabbitX
    In this post, the engineering team of RabbitX platform shares details about the usage of Centrifugo in their product.
    August 19, 2023 by Alexander Emelin
    In this post, we'll demonstrate how to asynchronously stream messages into Centrifugo channels from external data providers using Benthos tool. We also highlight some pitfalls which become more important in asynchronous publishing scenario.
    June 29, 2023 by Centrifugal team
    We are excited to announce a new version of Centrifugo. It's an evolutionary step which makes Centrifugo cleaner and more intuitive to use.
    July 19, 2022 by Centrifugal team
    Centrifugo v4 provides an optimized client protocol, modern WebSocket emulation, improved channel security, redesigned client SDK behavior, experimental HTTP/3 and WebTransport support.
    October 18, 2021 by Alexander Emelin
    In this tutorial we are integrating Centrifugo with NodeJS. We are using Centrifugo connect proxy feature to authenticate connections over standard Express.js session middleware.
    August 31, 2021 by Centrifugal team
    Centrifugo v3 released with lots of exciting improvements
    \ No newline at end of file diff --git a/blog/tags/django.html b/blog/tags/django.html index 8811c52a3..839c2a6aa 100644 --- a/blog/tags/django.html +++ b/blog/tags/django.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "django"

    View All Tags
    diff --git a/blog/tags/go.html b/blog/tags/go.html index 3ea08ca8d..649973258 100644 --- a/blog/tags/go.html +++ b/blog/tags/go.html @@ -15,8 +15,8 @@ - - + +

    5 posts tagged with "go"

    View All Tags
    November 12, 2020 by Alexander Emelin
    The post describes techniques to write scalable WebSocket servers within Go ecosystem and beyond it
    February 10, 2020 by Centrifugal team
    Describing a test stand in Kubernetes where we connect one million websocket connections to a server, using Redis to scale nodes, and providing insights about hardware resources required to achieve 500k messages per second
    diff --git a/blog/tags/grpc.html b/blog/tags/grpc.html new file mode 100644 index 000000000..ec8ee0239 --- /dev/null +++ b/blog/tags/grpc.html @@ -0,0 +1,24 @@ + + + + + +One post tagged with "grpc" | Centrifugo + + + + + + + + + + + + + + + +

    One post tagged with "grpc"

    View All Tags
    + + \ No newline at end of file diff --git a/blog/tags/interview.html b/blog/tags/interview.html index 0b410ce0d..e2ef09a9b 100644 --- a/blog/tags/interview.html +++ b/blog/tags/interview.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "interview"

    View All Tags
    August 29, 2023 by Centrifugal + RabbitX
    In this post, the engineering team of RabbitX platform shares details about the usage of Centrifugo in their product.
    diff --git a/blog/tags/keycloak.html b/blog/tags/keycloak.html index 963e70e3a..1d3a21790 100644 --- a/blog/tags/keycloak.html +++ b/blog/tags/keycloak.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "keycloak"

    View All Tags
    diff --git a/blog/tags/laravel.html b/blog/tags/laravel.html index 8b67a95dd..5f20d6708 100644 --- a/blog/tags/laravel.html +++ b/blog/tags/laravel.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "laravel"

    View All Tags
    diff --git a/blog/tags/loki.html b/blog/tags/loki.html new file mode 100644 index 000000000..8a05ec848 --- /dev/null +++ b/blog/tags/loki.html @@ -0,0 +1,24 @@ + + + + + +One post tagged with "loki" | Centrifugo + + + + + + + + + + + + + + + +

    One post tagged with "loki"

    View All Tags
    + + \ No newline at end of file diff --git a/blog/tags/php.html b/blog/tags/php.html index 7afe4341c..cdfc4cd63 100644 --- a/blog/tags/php.html +++ b/blog/tags/php.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "php"

    View All Tags
    diff --git a/blog/tags/pro.html b/blog/tags/pro.html index db035fef7..9f7c56571 100644 --- a/blog/tags/pro.html +++ b/blog/tags/pro.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "pro"

    View All Tags
    October 29, 2023 by Alexander Emelin
    We start talking more about recently launched Centrifugo PRO. In this post, we share details about Centrifugo PRO push notification API implementation - how it works and what makes it special and practical.
    diff --git a/blog/tags/proxy.html b/blog/tags/proxy.html index d00e86f11..edf5bb355 100644 --- a/blog/tags/proxy.html +++ b/blog/tags/proxy.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "proxy"

    View All Tags
    October 18, 2021 by Alexander Emelin
    In this tutorial we are integrating Centrifugo with NodeJS. We are using Centrifugo connect proxy feature to authenticate connections over standard Express.js session middleware.
    diff --git a/blog/tags/push-notifications.html b/blog/tags/push-notifications.html index 4e95f1759..346b233ff 100644 --- a/blog/tags/push-notifications.html +++ b/blog/tags/push-notifications.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "push notifications"

    View All Tags
    October 29, 2023 by Alexander Emelin
    We start talking more about recently launched Centrifugo PRO. In this post, we share details about Centrifugo PRO push notification API implementation - how it works and what makes it special and practical.
    diff --git a/blog/tags/quic.html b/blog/tags/quic.html index cfdd6d0b7..f9f6b768e 100644 --- a/blog/tags/quic.html +++ b/blog/tags/quic.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "quic"

    View All Tags
    diff --git a/blog/tags/redis.html b/blog/tags/redis.html index 1c63120fa..c7e357353 100644 --- a/blog/tags/redis.html +++ b/blog/tags/redis.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "redis"

    View All Tags
    diff --git a/blog/tags/release.html b/blog/tags/release.html index d0e07437c..0755d9450 100644 --- a/blog/tags/release.html +++ b/blog/tags/release.html @@ -15,8 +15,8 @@ - - + +

    3 posts tagged with "release"

    View All Tags
    June 29, 2023 by Centrifugal team
    We are excited to announce a new version of Centrifugo. It's an evolutionary step which makes Centrifugo cleaner and more intuitive to use.
    July 19, 2022 by Centrifugal team
    Centrifugo v4 provides an optimized client protocol, modern WebSocket emulation, improved channel security, redesigned client SDK behavior, experimental HTTP/3 and WebTransport support.
    August 31, 2021 by Centrifugal team
    Centrifugo v3 released with lots of exciting improvements
    diff --git a/blog/tags/sso.html b/blog/tags/sso.html index e7ba34190..45ebae3b7 100644 --- a/blog/tags/sso.html +++ b/blog/tags/sso.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "sso"

    View All Tags
    diff --git a/blog/tags/tutorial.html b/blog/tags/tutorial.html index b097aaeef..64655db22 100644 --- a/blog/tags/tutorial.html +++ b/blog/tags/tutorial.html @@ -15,8 +15,8 @@ - - + +

    5 posts tagged with "tutorial"

    View All Tags
    August 19, 2023 by Alexander Emelin
    In this post, we'll demonstrate how to asynchronously stream messages into Centrifugo channels from external data providers using Benthos tool. We also highlight some pitfalls which become more important in asynchronous publishing scenario.
    October 18, 2021 by Alexander Emelin
    In this tutorial we are integrating Centrifugo with NodeJS. We are using Centrifugo connect proxy feature to authenticate connections over standard Express.js session middleware.
    diff --git a/blog/tags/usecase.html b/blog/tags/usecase.html index b64c251f1..92e3d5b51 100644 --- a/blog/tags/usecase.html +++ b/blog/tags/usecase.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "usecase"

    View All Tags
    August 29, 2023 by Centrifugal + RabbitX
    In this post, the engineering team of RabbitX platform shares details about the usage of Centrifugo in their product.
    diff --git a/blog/tags/websocket.html b/blog/tags/websocket.html index 300b1ad73..60230b921 100644 --- a/blog/tags/websocket.html +++ b/blog/tags/websocket.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "websocket"

    View All Tags
    November 12, 2020 by Alexander Emelin
    The post describes techniques to write scalable WebSocket servers within Go ecosystem and beyond it
    diff --git a/blog/tags/webtransport.html b/blog/tags/webtransport.html index cbd147010..db4d40f2c 100644 --- a/blog/tags/webtransport.html +++ b/blog/tags/webtransport.html @@ -15,8 +15,8 @@ - - + +

    One post tagged with "webtransport"

    View All Tags
    diff --git a/components/Highlight.html b/components/Highlight.html index f13337d46..fe7398b61 100644 --- a/components/Highlight.html +++ b/components/Highlight.html @@ -15,8 +15,8 @@ - - + +

    diff --git a/components/logo.html b/components/logo.html index 5851d8888..600b84f40 100644 --- a/components/logo.html +++ b/components/logo.html @@ -15,8 +15,8 @@ - - + +
    diff --git a/components/logos/Badoo.html b/components/logos/Badoo.html index 8723bf657..d56bd62b4 100644 --- a/components/logos/Badoo.html +++ b/components/logos/Badoo.html @@ -15,8 +15,8 @@ - - + +
    diff --git a/components/logos/Grafana.html b/components/logos/Grafana.html index c70d63566..572c46293 100644 --- a/components/logos/Grafana.html +++ b/components/logos/Grafana.html @@ -15,8 +15,8 @@ - - + +
    diff --git a/components/logos/ManyChat.html b/components/logos/ManyChat.html index 73c3c8464..8fe9a0fe9 100644 --- a/components/logos/ManyChat.html +++ b/components/logos/ManyChat.html @@ -15,8 +15,8 @@ - - + +
    diff --git a/components/logos/OpenWeb.html b/components/logos/OpenWeb.html index 52c3d4a6c..e4de54cdb 100644 --- a/components/logos/OpenWeb.html +++ b/components/logos/OpenWeb.html @@ -15,8 +15,8 @@ - - + +
    diff --git a/docs/3/attributions.html b/docs/3/attributions.html index 56aa80947..a1ad25b54 100644 --- a/docs/3/attributions.html +++ b/docs/3/attributions.html @@ -15,8 +15,8 @@ - - + +

    Attributions

    Landing Page Images

    diff --git a/docs/3/ecosystem/centrifuge.html b/docs/3/ecosystem/centrifuge.html index c2e686d2b..69950661e 100644 --- a/docs/3/ecosystem/centrifuge.html +++ b/docs/3/ecosystem/centrifuge.html @@ -15,8 +15,8 @@ - - + +

    Centrifuge library

    Centrifugo is a server built on top of Centrifuge library for Go language.

    diff --git a/docs/3/ecosystem/integrations.html b/docs/3/ecosystem/integrations.html index ec37b8b41..1777423c7 100644 --- a/docs/3/ecosystem/integrations.html +++ b/docs/3/ecosystem/integrations.html @@ -15,8 +15,8 @@ - - + +

    Framework integrations

    tip

    In general, integrating Centrifugo can be done in several steps even without third-party libraries – see our integration guide. But there are some community-driven projects that provide integration for more native experience or even some additional functionality on top of Centrifugo.

    diff --git a/docs/3/faq.html b/docs/3/faq.html index 222b01546..7245ea303 100644 --- a/docs/3/faq.html +++ b/docs/3/faq.html @@ -15,8 +15,8 @@ - - + +

    Frequently Asked Questions

    Answers to popular questions here.

    diff --git a/docs/3/flow_diagrams.html b/docs/3/flow_diagrams.html index 750a58912..eeb50b53f 100644 --- a/docs/3/flow_diagrams.html +++ b/docs/3/flow_diagrams.html @@ -15,8 +15,8 @@ - - + +

    flow_diagrams

    For swimlines.io:

    diff --git a/docs/3/getting-started/client_api.html b/docs/3/getting-started/client_api.html index 0feee5bf9..1afa50964 100644 --- a/docs/3/getting-started/client_api.html +++ b/docs/3/getting-started/client_api.html @@ -15,8 +15,8 @@ - - + +

    Client API showcase

    This chapter showcases Centrifugo bidirectional client API capabilities – i.e. real-time messaging primitives available on a front-end (can be a browser or a mobile device).

    diff --git a/docs/3/getting-started/design.html b/docs/3/getting-started/design.html index c4d759f43..a21a9b903 100644 --- a/docs/3/getting-started/design.html +++ b/docs/3/getting-started/design.html @@ -15,8 +15,8 @@ - - + +

    Design overview

    Let's discuss some architectural and design topics about Centrifugo.

    diff --git a/docs/3/getting-started/highlights.html b/docs/3/getting-started/highlights.html index b5a287a07..724b09d85 100644 --- a/docs/3/getting-started/highlights.html +++ b/docs/3/getting-started/highlights.html @@ -15,8 +15,8 @@ - - + +

    Main highlights

    At this point you know how to build the simplest real-time app with Centrifugo. Beyond the core PUB/SUB functionality Centrifugo provides more features and primitives to build scalable real-time applications. Let's summarize main Centrifugo ✨highlights✨ here. Every point is then extended throughout the documentation.

    diff --git a/docs/3/getting-started/installation.html b/docs/3/getting-started/installation.html index f31ebefce..4a75a797a 100644 --- a/docs/3/getting-started/installation.html +++ b/docs/3/getting-started/installation.html @@ -15,8 +15,8 @@ - - + +

    Install Centrifugo

    Centrifugo server is written in Go language. It's an open-source software, the source code is available on Github.

    diff --git a/docs/3/getting-started/integration.html b/docs/3/getting-started/integration.html index efc5bc18c..c424ec99a 100644 --- a/docs/3/getting-started/integration.html +++ b/docs/3/getting-started/integration.html @@ -15,8 +15,8 @@ - - + +

    Integration guide

    This chapter aims to help you get started with Centrifugo. We will look at a step-by-step workflow of integrating your application with Centrifugo providing links to relevant parts of this documentation.

    diff --git a/docs/3/getting-started/introduction.html b/docs/3/getting-started/introduction.html index 0f80c8755..39062ddf4 100644 --- a/docs/3/getting-started/introduction.html +++ b/docs/3/getting-started/introduction.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo introduction

    Centrifugo is an open-source scalable real-time messaging server in a language-agnostic way.

    diff --git a/docs/3/getting-started/migration_v3.html b/docs/3/getting-started/migration_v3.html index 5aaf9b3ff..6c7abb0c6 100644 --- a/docs/3/getting-started/migration_v3.html +++ b/docs/3/getting-started/migration_v3.html @@ -15,8 +15,8 @@ - - + +

    Migrating to v3

    This chapter aims to help developers migrate from Centrifugo v2 to Centrifugo v3. Migration should mostly affect the backend part only, so you won't need to change the code of your frontend applications at all. In most cases, all you should do is adapt Centrifugo configuration to match v3 changes and redeploy Centrifugo using v3 build instead of v2.

    diff --git a/docs/3/getting-started/quickstart.html b/docs/3/getting-started/quickstart.html index 6df78885e..9be83cb57 100644 --- a/docs/3/getting-started/quickstart.html +++ b/docs/3/getting-started/quickstart.html @@ -15,8 +15,8 @@ - - + +

    Quickstart tutorial ⏱️

    Here we will build a very simple browser application with Centrifugo. It works in a way that users connect to Centrifugo over WebSocket, subscribe to a channel, and start receiving all messages published to that channel. In our case, we will send a counter value to all channel subscribers to update it in all open browser tabs in real-time.

    diff --git a/docs/3/pro/analytics.html b/docs/3/pro/analytics.html index a68aaa84e..ce56fadbe 100644 --- a/docs/3/pro/analytics.html +++ b/docs/3/pro/analytics.html @@ -15,8 +15,8 @@ - - + +

    Analytics with ClickHouse

    This feature allows exporting information about connections, subscriptions and client operations to ClickHouse thus providing an integration with a real-time (with seconds delay) analytics storage. ClickHouse is super fast and simple to operate with, and it allows effective data keeping for a window of time.

    diff --git a/docs/3/pro/db_namespaces.html b/docs/3/pro/db_namespaces.html index d1887d035..7ca5ed2c4 100644 --- a/docs/3/pro/db_namespaces.html +++ b/docs/3/pro/db_namespaces.html @@ -15,8 +15,8 @@ - - + +

    Database-driven namespace configuration

    Centrifugo PRO supports database-driven namespace configuration. This means that instead of configuring namespaces in a configuration file you will be able to configure them in admin web UI. It's also possible to select a namespace for automatic personal channel subscription.

    diff --git a/docs/3/pro/install_and_run.html b/docs/3/pro/install_and_run.html index cf347c6cb..efe8633ef 100644 --- a/docs/3/pro/install_and_run.html +++ b/docs/3/pro/install_and_run.html @@ -15,8 +15,8 @@ - - + +

    Install and run PRO version

    caution

    Centrifugo PRO is distributed under commercial license which is different from OSS version. By downloading Centrifugo PRO you automatically accept license terms.

    diff --git a/docs/3/pro/overview.html b/docs/3/pro/overview.html index 4f0603598..904257a88 100644 --- a/docs/3/pro/overview.html +++ b/docs/3/pro/overview.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo PRO overview

    Centrifugo PRO is an extended version of Centrifugo with a set of additional features. These features can provide your business with unique benefits – drastically save development time, reduce resource usage on a server, protect your backend from misusing, and put the system observability to the next level.

    diff --git a/docs/3/pro/performance.html b/docs/3/pro/performance.html index d2b4023b6..98351332d 100644 --- a/docs/3/pro/performance.html +++ b/docs/3/pro/performance.html @@ -15,8 +15,8 @@ - - + +

    Faster performance

    Centrifugo PRO has performance improvements for several server parts. These improvements can help to reduce tail end-to-end latencies in application, increase server throughput and/or reduce CPU usage on server machines.

    diff --git a/docs/3/pro/process_stats.html b/docs/3/pro/process_stats.html index 0b396fd0a..ad636b757 100644 --- a/docs/3/pro/process_stats.html +++ b/docs/3/pro/process_stats.html @@ -15,8 +15,8 @@ - - + +

    CPU and RSS stats

    A useful addition of Centrifugo PRO is an ability to show CPU and RSS memory usage of each node in admin web UI.

    diff --git a/docs/3/pro/singleflight.html b/docs/3/pro/singleflight.html index c44a42eb6..c2c109f83 100644 --- a/docs/3/pro/singleflight.html +++ b/docs/3/pro/singleflight.html @@ -15,8 +15,8 @@ - - + +

    Singleflight

    Centrifugo PRO provides an additional boolean option use_singleflight (default false). When this option enabled Centrifugo will automatically try to merge identical requests to history, online presence or presence stats issued at the same time into one real network request.

    diff --git a/docs/3/pro/throttling.html b/docs/3/pro/throttling.html index 6f7d93f24..b2c7201fc 100644 --- a/docs/3/pro/throttling.html +++ b/docs/3/pro/throttling.html @@ -15,8 +15,8 @@ - - + +

    Operation throttling

    The throttling feature allows limiting the number of operations each user can issue during a configured time interval. This is useful to protect the system from misusing or protect it from a bug in the application frontend code.

    diff --git a/docs/3/pro/token_revocation.html b/docs/3/pro/token_revocation.html index 48f908b97..8a4a72788 100644 --- a/docs/3/pro/token_revocation.html +++ b/docs/3/pro/token_revocation.html @@ -15,8 +15,8 @@ - - + +

    Token revocation API

    One more protective instrument in Centrifugo PRO is API to manage token revocations.

    diff --git a/docs/3/pro/tracing.html b/docs/3/pro/tracing.html index f52a4d648..a7b3f6cfb 100644 --- a/docs/3/pro/tracing.html +++ b/docs/3/pro/tracing.html @@ -15,8 +15,8 @@ - - + +

    User and channel tracing

    That's a unique thing. The tracing feature of Centrifugo PRO allows attaching to any channel to see all messages flying towards subscribers or attach to a specific user ID to see all user-related events in real-time.

    diff --git a/docs/3/pro/user_block.html b/docs/3/pro/user_block.html index 7f4324fa1..37e2c6f04 100644 --- a/docs/3/pro/user_block.html +++ b/docs/3/pro/user_block.html @@ -15,8 +15,8 @@ - - + +

    User blocking API

    In addition to detailed observability properties Centrifugo PRO provides instruments for performing protective actions. One of such instruments is user blocking API which allows blocking a specific user in Centrifugo.

    diff --git a/docs/3/pro/user_connections.html b/docs/3/pro/user_connections.html index 97074027b..181a995b2 100644 --- a/docs/3/pro/user_connections.html +++ b/docs/3/pro/user_connections.html @@ -15,8 +15,8 @@ - - + +

    User connections API

    Centrifugo PRO provides an additional API call user_connections. It allows getting all active sessions of the user (by user ID) without turning on presence feature for channels at all. It's also possible to attach any JSON payload to a connection which will be then visible in the result of user_connections call. The important thing is that this additional meta information won't be exposed to a client-side (unlike connection info for example).

    diff --git a/docs/3/pro/user_status.html b/docs/3/pro/user_status.html index 66468f61a..14ee1092a 100644 --- a/docs/3/pro/user_status.html +++ b/docs/3/pro/user_status.html @@ -15,8 +15,8 @@ - - + +

    User status

    Centrifugo OSS provides a presence feature for channels. It works well (for channels with reasonably small number of active subscribers though), but sometimes you may need a bit different functionality.

    diff --git a/docs/3/server/admin_web.html b/docs/3/server/admin_web.html index ab321a489..0292c6554 100644 --- a/docs/3/server/admin_web.html +++ b/docs/3/server/admin_web.html @@ -15,8 +15,8 @@ - - + +

    Admin web UI

    Centrifugo comes with builtin admin web interface. It can:

    diff --git a/docs/3/server/authentication.html b/docs/3/server/authentication.html index cedc86794..e9567b72c 100644 --- a/docs/3/server/authentication.html +++ b/docs/3/server/authentication.html @@ -15,8 +15,8 @@ - - + +

    Client authentication

    To authenticate incoming connection (client) Centrifugo can use JSON Web Token (JWT) passed from the client-side. This way Centrifugo may know the ID of user in your application, also application can pass additional data to Centrifugo inside JWT claims. This chapter describes this authentication mechanism.

    diff --git a/docs/3/server/channels.html b/docs/3/server/channels.html index 3121e3fdf..93f129cf5 100644 --- a/docs/3/server/channels.html +++ b/docs/3/server/channels.html @@ -15,8 +15,8 @@ - - + +

    Channels

    Channel is a route for publications. Clients can be subscribed to a channel to receive real-time messages published to a channel – new publications and join/leave events (if enabled for a channel namespace). A channel subscriber can also ask for a channel presence or channel history information (if enabled for a channel namespace).

    diff --git a/docs/3/server/codes.html b/docs/3/server/codes.html index fde59abe5..37c6d2d2e 100644 --- a/docs/3/server/codes.html +++ b/docs/3/server/codes.html @@ -15,8 +15,8 @@ - - + +

    Error and disconnect codes

    This chapter describes error and disconnect codes Centrifugo uses in a client protocol, also error codes which a server API can return in response.

    diff --git a/docs/3/server/configuration.html b/docs/3/server/configuration.html index bb387fa2f..20225cbef 100644 --- a/docs/3/server/configuration.html +++ b/docs/3/server/configuration.html @@ -15,8 +15,8 @@ - - + +

    Configure Centrifugo

    Let's look at how Centrifugo can be configured.

    diff --git a/docs/3/server/console_commands.html b/docs/3/server/console_commands.html index 4102aba02..687e6b725 100644 --- a/docs/3/server/console_commands.html +++ b/docs/3/server/console_commands.html @@ -15,8 +15,8 @@ - - + +

    Console commands

    Here is a list of console commands that come with Centrifugo executable.

    diff --git a/docs/3/server/engines.html b/docs/3/server/engines.html index 772bc8424..fe3fe2193 100644 --- a/docs/3/server/engines.html +++ b/docs/3/server/engines.html @@ -15,8 +15,8 @@ - - + +

    Engines, scalability

    The Engine in Centrifugo is responsible for publishing messages between nodes, handle PUB/SUB broker subscriptions, save/retrieve online presence and history data.

    diff --git a/docs/3/server/history_and_recovery.html b/docs/3/server/history_and_recovery.html index 406658330..afa669e1c 100644 --- a/docs/3/server/history_and_recovery.html +++ b/docs/3/server/history_and_recovery.html @@ -15,8 +15,8 @@ - - + +

    History and recovery

    Centrifugo engines can maintain publication history for channels with configured history size and TTL.

    diff --git a/docs/3/server/infra_tuning.html b/docs/3/server/infra_tuning.html index 7a6c9b88e..01e826219 100644 --- a/docs/3/server/infra_tuning.html +++ b/docs/3/server/infra_tuning.html @@ -15,8 +15,8 @@ - - + +

    Infrastructure tuning

    As Centrifugo deals with lots of persistent connections your operating system and server infrastructure must be ready for it.

    diff --git a/docs/3/server/load_balancing.html b/docs/3/server/load_balancing.html index 9a6d25864..b7ff24b6a 100644 --- a/docs/3/server/load_balancing.html +++ b/docs/3/server/load_balancing.html @@ -15,8 +15,8 @@ - - + +

    Load balancing

    This chapter shows how to deal with persistent connection load balancing.

    diff --git a/docs/3/server/monitoring.html b/docs/3/server/monitoring.html index 76f1b7583..e37bd9704 100644 --- a/docs/3/server/monitoring.html +++ b/docs/3/server/monitoring.html @@ -15,8 +15,8 @@ - - + +

    Monitoring

    Centrifugo supports reporting metrics in Prometheus format and can automatically export metrics to Graphite.

    diff --git a/docs/3/server/private_channels.html b/docs/3/server/private_channels.html index a36b1caa3..2a03488f3 100644 --- a/docs/3/server/private_channels.html +++ b/docs/3/server/private_channels.html @@ -15,8 +15,8 @@ - - + +

    Private channels

    In the channels chapter we mentioned private channels. This chapter has more information about the private channel mechanism in Centrifugo.

    diff --git a/docs/3/server/proxy.html b/docs/3/server/proxy.html index d55b9ec5b..feb344eb0 100644 --- a/docs/3/server/proxy.html +++ b/docs/3/server/proxy.html @@ -15,8 +15,8 @@ - - + +

    Proxy to backend

    It's possible to proxy some client connection events from Centrifugo to the application backend and react to them in a custom way. For example, it's possible to authenticate connection via request from Centrifugo to application backend, refresh client sessions and answer to RPC calls sent by a client over bidirectional connection.

    diff --git a/docs/3/server/server_api.html b/docs/3/server/server_api.html index c3601e8fe..de3ce6e0f 100644 --- a/docs/3/server/server_api.html +++ b/docs/3/server/server_api.html @@ -15,8 +15,8 @@ - - + +

    Server API

    Server API is a way to send various commands to Centrifugo. For example, server API allows publishing messages to channels, get server statistics, etc. There are two kinds of API available at the moment:

    diff --git a/docs/3/server/server_subs.html b/docs/3/server/server_subs.html index 19f5c43a0..2a665bd7e 100644 --- a/docs/3/server/server_subs.html +++ b/docs/3/server/server_subs.html @@ -15,8 +15,8 @@ - - + +

    Server-side subscriptions

    Centrifugo clients can initiate a subscription to a channel by calling the Subscribe method of client protocol. In most cases, this is the most flexible approach since a client-side usually knows which channels it needs to consume at a concrete moment. But in some situations, all you need is to subscribe your connections to several channels on a server-side at the moment of connection establishment. So client effectively starts receiving publications from those channels without calling the Subscribe method at all.

    diff --git a/docs/3/server/tls.html b/docs/3/server/tls.html index 7027d37b4..f75f723b8 100644 --- a/docs/3/server/tls.html +++ b/docs/3/server/tls.html @@ -15,8 +15,8 @@ - - + +

    Configure TLS

    TLS/SSL layer is very important not only for securing your connections but also to increase a diff --git a/docs/3/transports/client_protocol.html b/docs/3/transports/client_protocol.html index 61fac37bf..438d3e855 100644 --- a/docs/3/transports/client_protocol.html +++ b/docs/3/transports/client_protocol.html @@ -15,8 +15,8 @@ - - + +

    Client protocol

    This chapter describes internal bidirectional client-server protocol in details to help developers build new client libraries or understand how existing client connectors work.

    diff --git a/docs/3/transports/client_sdk.html b/docs/3/transports/client_sdk.html index 32a4adc34..fb6fbc455 100644 --- a/docs/3/transports/client_sdk.html +++ b/docs/3/transports/client_sdk.html @@ -15,8 +15,8 @@ - - + +

    Client real-time SDKs

    The following SDKs allow connecting to Centrifugo from the application frontend:

    diff --git a/docs/3/transports/overview.html b/docs/3/transports/overview.html index 5b958d23a..f9c927e08 100644 --- a/docs/3/transports/overview.html +++ b/docs/3/transports/overview.html @@ -15,8 +15,8 @@ - - + +

    Real-time transports

    Centrifugo supports a variety of transports to deliver real-time messages to clients.

    diff --git a/docs/3/transports/sockjs.html b/docs/3/transports/sockjs.html index 215150031..9e990971b 100644 --- a/docs/3/transports/sockjs.html +++ b/docs/3/transports/sockjs.html @@ -15,8 +15,8 @@ - - + +

    SockJS

    SockJS is a polyfill browser library which provides HTTP-based fallback transports in case when it's not possible to establish Websocket connection. This can happen in old client browsers or because of some proxy behind client and server that cuts of Websocket traffic. You can find more information on SockJS project Github page.

    diff --git a/docs/3/transports/uni_grpc.html b/docs/3/transports/uni_grpc.html index 6cdbfb8f6..f82b0274d 100644 --- a/docs/3/transports/uni_grpc.html +++ b/docs/3/transports/uni_grpc.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional GRPC

    It's possible to connect to GRPC unidirectional stream to consume real-time messages from Centrifugo. In this case you need to generate GRPC code for your language on client-side.

    diff --git a/docs/3/transports/uni_http_stream.html b/docs/3/transports/uni_http_stream.html index d8d7e4c0d..85635f40d 100644 --- a/docs/3/transports/uni_http_stream.html +++ b/docs/3/transports/uni_http_stream.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional HTTP streaming

    Default unidirectional HTTP streaming connection endpoint in Centrifugo is:

    diff --git a/docs/3/transports/uni_sse.html b/docs/3/transports/uni_sse.html index 41a2e8adb..0cab47b0f 100644 --- a/docs/3/transports/uni_sse.html +++ b/docs/3/transports/uni_sse.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional SSE (EventSource)

    Default unidirectional SSE (EventSource) connection endpoint in Centrifugo is:

    diff --git a/docs/3/transports/uni_websocket.html b/docs/3/transports/uni_websocket.html index f893e2c9c..3c679ecc7 100644 --- a/docs/3/transports/uni_websocket.html +++ b/docs/3/transports/uni_websocket.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional WebSocket

    Default unidirectional WebSocket connection endpoint in Centrifugo is:

    diff --git a/docs/3/transports/websocket.html b/docs/3/transports/websocket.html index 658491bf2..e2751ffb6 100644 --- a/docs/3/transports/websocket.html +++ b/docs/3/transports/websocket.html @@ -15,8 +15,8 @@ - - + +

    WebSocket

    Websocket is the main transport in Centrifugo. It's a very efficient low-overhead protocol on top of TCP.

    diff --git a/docs/4/attributions.html b/docs/4/attributions.html index f68589175..e72d28eb3 100644 --- a/docs/4/attributions.html +++ b/docs/4/attributions.html @@ -15,8 +15,8 @@ - - + +

    Attributions

    Landing Page Images

    diff --git a/docs/4/faq.html b/docs/4/faq.html index bfe88ffc9..6274b0e43 100644 --- a/docs/4/faq.html +++ b/docs/4/faq.html @@ -15,8 +15,8 @@ - - + +

    Frequently Asked Questions

    Answers to popular questions here.

    diff --git a/docs/4/flow_diagrams.html b/docs/4/flow_diagrams.html index dfee2aef8..507554da6 100644 --- a/docs/4/flow_diagrams.html +++ b/docs/4/flow_diagrams.html @@ -15,8 +15,8 @@ - - + +

    flow_diagrams

    For swimlanes.io:

    diff --git a/docs/4/getting-started/client_api.html b/docs/4/getting-started/client_api.html index 2c08156e4..2a0129c7a 100644 --- a/docs/4/getting-started/client_api.html +++ b/docs/4/getting-started/client_api.html @@ -15,8 +15,8 @@ - - + +

    Client API showcase

    This chapter showcases Centrifugo bidirectional client API capabilities – i.e. real-time messaging primitives available on a front-end (can be a browser or a mobile device).

    diff --git a/docs/4/getting-started/community.html b/docs/4/getting-started/community.html index 36cbb4c2a..17bee1962 100644 --- a/docs/4/getting-started/community.html +++ b/docs/4/getting-started/community.html @@ -15,8 +15,8 @@ - - + +

    Join community

    If you find Centrifugo interesting – please welcome to our community rooms in Telegram (the most active) and Discord:

    diff --git a/docs/4/getting-started/design.html b/docs/4/getting-started/design.html index 8061ff8a8..624c7fc77 100644 --- a/docs/4/getting-started/design.html +++ b/docs/4/getting-started/design.html @@ -15,8 +15,8 @@ - - + +

    Design overview

    Let's discuss some architectural and design topics about Centrifugo.

    diff --git a/docs/4/getting-started/ecosystem.html b/docs/4/getting-started/ecosystem.html index 40f4335b4..e33703ad5 100644 --- a/docs/4/getting-started/ecosystem.html +++ b/docs/4/getting-started/ecosystem.html @@ -15,8 +15,8 @@ - - + +

    Ecosystem notes

    Some additional notes about our ecosystem which may help you develop with our tech.

    diff --git a/docs/4/getting-started/highlights.html b/docs/4/getting-started/highlights.html index e8fad95d9..77e56205e 100644 --- a/docs/4/getting-started/highlights.html +++ b/docs/4/getting-started/highlights.html @@ -15,8 +15,8 @@ - - + +

    Main highlights

    At this point you know how to build the simplest real-time app with Centrifugo. Beyond the core PUB/SUB functionality Centrifugo provides more features and primitives to build scalable real-time applications. Let's summarize main Centrifugo ✨highlights✨ here. Every point is then extended throughout the documentation.

    diff --git a/docs/4/getting-started/installation.html b/docs/4/getting-started/installation.html index 931c488bc..6b8c0dda6 100644 --- a/docs/4/getting-started/installation.html +++ b/docs/4/getting-started/installation.html @@ -15,8 +15,8 @@ - - + +

    Install Centrifugo

    Centrifugo server is written in Go language. It's an open-source software, the source code is available on Github.

    diff --git a/docs/4/getting-started/integration.html b/docs/4/getting-started/integration.html index f79ed9d6f..b23480535 100644 --- a/docs/4/getting-started/integration.html +++ b/docs/4/getting-started/integration.html @@ -15,8 +15,8 @@ - - + +

    Integration guide

    This chapter aims to help you get started with Centrifugo. We will look at a step-by-step workflow of integrating your application with Centrifugo providing links to relevant parts of this documentation.

    diff --git a/docs/4/getting-started/introduction.html b/docs/4/getting-started/introduction.html index b6f136609..e0963fba9 100644 --- a/docs/4/getting-started/introduction.html +++ b/docs/4/getting-started/introduction.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo introduction

    diff --git a/docs/4/getting-started/migration_v4.html b/docs/4/getting-started/migration_v4.html index ca19a785a..b3719c052 100644 --- a/docs/4/getting-started/migration_v4.html +++ b/docs/4/getting-started/migration_v4.html @@ -15,8 +15,8 @@ - - + +

    Migrating to v4

    Centrifugo v4 development was concentrated around two main things:

    diff --git a/docs/4/getting-started/quickstart.html b/docs/4/getting-started/quickstart.html index ef587300d..2f4d57ca3 100644 --- a/docs/4/getting-started/quickstart.html +++ b/docs/4/getting-started/quickstart.html @@ -15,8 +15,8 @@ - - + +

    Quickstart tutorial ⏱️

    In this tutorial we will build a very simple browser application with Centrifugo. Users will connect to Centrifugo over WebSocket, subscribe to a channel, and start receiving all channel publications (messages published to that channel). In our case, we will send a counter value to all channel subscribers to update counter widget in all open browser tabs in real-time.

    diff --git a/docs/4/pro/analytics.html b/docs/4/pro/analytics.html index a42c289dd..709cffbd2 100644 --- a/docs/4/pro/analytics.html +++ b/docs/4/pro/analytics.html @@ -15,8 +15,8 @@ - - + +

    Analytics with ClickHouse

    This feature allows exporting information about channel publications, client connections, channel subscriptions, client operations and push notifications to ClickHouse thus providing an integration with a real-time (with seconds delay) analytics storage. ClickHouse is super fast for analytical queries, simple to operate with and it allows effective data keeping for a window of time. Also, it's relatively simple to create a high performance ClickHouse cluster.

    diff --git a/docs/4/pro/capabilities.html b/docs/4/pro/capabilities.html index 0b14c3593..76955a395 100644 --- a/docs/4/pro/capabilities.html +++ b/docs/4/pro/capabilities.html @@ -15,8 +15,8 @@ - - + +

    Channel capabilities

    At this point you know that Centrifugo allows configuring channel permissions on a per-namespace level. When creating a new real-time feature it's recommended to create a new namespace for it and configure permissions. To achieve a better channel permission control inside a namespace Centrifugo PRO provides possibility to set capabilities on individual connection basis, or individual channel subscription basis.

    diff --git a/docs/4/pro/cel_expressions.html b/docs/4/pro/cel_expressions.html index 60fdad8a1..f5915de8b 100644 --- a/docs/4/pro/cel_expressions.html +++ b/docs/4/pro/cel_expressions.html @@ -15,8 +15,8 @@ - - + +

    CEL expressions

    This PRO feature is under active development, some changes expected here 🚧

    diff --git a/docs/4/pro/channel_patterns.html b/docs/4/pro/channel_patterns.html index 822b6caab..37819ec95 100644 --- a/docs/4/pro/channel_patterns.html +++ b/docs/4/pro/channel_patterns.html @@ -15,8 +15,8 @@ - - + +

    Channel patterns

    This PRO feature is under active development, some changes expected here 🚧

    diff --git a/docs/4/pro/client_message_batching.html b/docs/4/pro/client_message_batching.html index e0177614e..be69bce6c 100644 --- a/docs/4/pro/client_message_batching.html +++ b/docs/4/pro/client_message_batching.html @@ -15,8 +15,8 @@ - - + +

    Message batching control

    This PRO feature is under active development, some changes expected here 🚧

    diff --git a/docs/4/pro/connections.html b/docs/4/pro/connections.html index e236c5e06..f16042464 100644 --- a/docs/4/pro/connections.html +++ b/docs/4/pro/connections.html @@ -15,8 +15,8 @@ - - + +

    Connections API

    Centrifugo PRO offers an extra API call, connections, which enables retrieval of all active sessions (based on user ID or expression) without the need to activate the presence feature for channels. Furthermore, developers can attach any desired JSON payload to a connection that will then be visible in the result of the connections call. It's worth noting that this additional meta-information remains hidden from the client-side, unlike the info associated with the connection.

    diff --git a/docs/4/pro/install_and_run.html b/docs/4/pro/install_and_run.html index aa1320831..04ef8d58d 100644 --- a/docs/4/pro/install_and_run.html +++ b/docs/4/pro/install_and_run.html @@ -15,8 +15,8 @@ - - + +

    Install and run PRO version

    Centrifugo PRO license agreement

    Centrifugo PRO is distributed by Centrifugal Labs LTD under commercial license which is different from OSS version. By downloading Centrifugo PRO you automatically accept commercial license terms.

    diff --git a/docs/4/pro/overview.html b/docs/4/pro/overview.html index a656a0940..8456e3760 100644 --- a/docs/4/pro/overview.html +++ b/docs/4/pro/overview.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo PRO overview

    diff --git a/docs/4/pro/performance.html b/docs/4/pro/performance.html index c3007a461..887aa3bb6 100644 --- a/docs/4/pro/performance.html +++ b/docs/4/pro/performance.html @@ -15,8 +15,8 @@ - - + +

    Faster performance

    diff --git a/docs/4/pro/process_stats.html b/docs/4/pro/process_stats.html index 61c33d2ef..d0860db62 100644 --- a/docs/4/pro/process_stats.html +++ b/docs/4/pro/process_stats.html @@ -15,8 +15,8 @@ - - + +

    CPU and RSS stats

    A useful addition of Centrifugo PRO is an ability to show CPU and RSS memory usage of each node in admin web UI.

    diff --git a/docs/4/pro/push_notifications.html b/docs/4/pro/push_notifications.html index 9212a2da4..9c54d97ee 100644 --- a/docs/4/pro/push_notifications.html +++ b/docs/4/pro/push_notifications.html @@ -15,8 +15,8 @@ - - + +

    Push notification API

    This PRO feature is under active development, some changes expected here 🚧

    diff --git a/docs/4/pro/singleflight.html b/docs/4/pro/singleflight.html index 7f66f3532..ba71c9c69 100644 --- a/docs/4/pro/singleflight.html +++ b/docs/4/pro/singleflight.html @@ -15,8 +15,8 @@ - - + +

    Singleflight

    Centrifugo PRO provides an additional boolean option use_singleflight (default false). When this option enabled Centrifugo will automatically try to merge identical requests to history, online presence or presence stats issued at the same time into one real network request. It will do this by using in-memory component called singleflight.

    diff --git a/docs/4/pro/throttling.html b/docs/4/pro/throttling.html index 28965af2b..051fdad90 100644 --- a/docs/4/pro/throttling.html +++ b/docs/4/pro/throttling.html @@ -15,8 +15,8 @@ - - + +

    Operation throttling

    The throttling feature allows limiting the number of operations each connection or user can issue during a configured time interval. This is useful to protect the system from misusing, detecting and disconnecting abusive or broken (due to the bug in the frontend application) clients which add unwanted load on a server.

    diff --git a/docs/4/pro/token_revocation.html b/docs/4/pro/token_revocation.html index 492190042..4955221a9 100644 --- a/docs/4/pro/token_revocation.html +++ b/docs/4/pro/token_revocation.html @@ -15,8 +15,8 @@ - - + +

    Token revocation API

    One more protective instrument in Centrifugo PRO is API to manage token revocations.

    diff --git a/docs/4/pro/tracing.html b/docs/4/pro/tracing.html index ea2177b3b..b253c5799 100644 --- a/docs/4/pro/tracing.html +++ b/docs/4/pro/tracing.html @@ -15,8 +15,8 @@ - - + +

    User and channel tracing

    That's a unique thing. The tracing feature of Centrifugo PRO allows attaching to any channel to see all messages flying towards subscribers or attach to a specific user ID to see all user-related events in real-time.

    diff --git a/docs/4/pro/user_block.html b/docs/4/pro/user_block.html index d02f5df0a..f4856cfd7 100644 --- a/docs/4/pro/user_block.html +++ b/docs/4/pro/user_block.html @@ -15,8 +15,8 @@ - - + +

    User blocking API

    One additional instrument for making protective actions in Centrifugo PRO is user blocking API which allows blocking a specific user on Centrifugo level.

    diff --git a/docs/4/pro/user_status.html b/docs/4/pro/user_status.html index 13f00de81..1ec68a147 100644 --- a/docs/4/pro/user_status.html +++ b/docs/4/pro/user_status.html @@ -15,8 +15,8 @@ - - + +

    User status API

    Centrifugo OSS provides a presence feature for channels. It works well (for channels with reasonably small number of active subscribers though), but sometimes you may need a bit different functionality.

    diff --git a/docs/4/server/admin_web.html b/docs/4/server/admin_web.html index e230b232a..3ef610827 100644 --- a/docs/4/server/admin_web.html +++ b/docs/4/server/admin_web.html @@ -15,8 +15,8 @@ - - + +

    Admin web UI

    Centrifugo comes with a built-in admin web interface. It can:

    diff --git a/docs/4/server/authentication.html b/docs/4/server/authentication.html index 5074b1a55..6c902a122 100644 --- a/docs/4/server/authentication.html +++ b/docs/4/server/authentication.html @@ -15,8 +15,8 @@ - - + +

    Client JWT authentication

    To authenticate incoming connection (client) Centrifugo can use JSON Web Token (JWT) passed from the client-side. This way Centrifugo may know the ID of user in your application, also application can pass additional data to Centrifugo inside JWT claims. This chapter describes this authentication mechanism.

    diff --git a/docs/4/server/channel_permissions.html b/docs/4/server/channel_permissions.html index 365219e00..a9a6a3d50 100644 --- a/docs/4/server/channel_permissions.html +++ b/docs/4/server/channel_permissions.html @@ -15,8 +15,8 @@ - - + +

    Channel permission model

    When using Centrifugo server API you don't need to think about channel permissions at all – everything is allowed. In server API case, request to Centrifugo must be issued by your application backend – so you have all the power to check any required permissions before issuing API request to Centrifugo.

    diff --git a/docs/4/server/channel_token_auth.html b/docs/4/server/channel_token_auth.html index c28f1112b..d966cd71e 100644 --- a/docs/4/server/channel_token_auth.html +++ b/docs/4/server/channel_token_auth.html @@ -15,8 +15,8 @@ - - + +

    Channel JWT authorization

    In the chapter about channel permissions we mentioned that to subscribe on a channel client can provide subscription token. This chapter has more information about the subscription token mechanism in Centrifugo.

    diff --git a/docs/4/server/channels.html b/docs/4/server/channels.html index c3ccb090c..e23c22cab 100644 --- a/docs/4/server/channels.html +++ b/docs/4/server/channels.html @@ -15,8 +15,8 @@ - - + +

    Channels and namespaces

    Upon connecting to a server clients can subscribe to channels. Channel is one of the core concepts of Centrifugo. Most of the time when integrating Centrifugo you will work with channels and decide what is the best channel configuration for your application.

    diff --git a/docs/4/server/codes.html b/docs/4/server/codes.html index 095a8f6f3..9179705cb 100644 --- a/docs/4/server/codes.html +++ b/docs/4/server/codes.html @@ -15,8 +15,8 @@ - - + +

    Error and disconnect codes

    This chapter describes error and disconnect codes Centrifugo uses in a client protocol, also error codes which a server API can return in response.

    diff --git a/docs/4/server/configuration.html b/docs/4/server/configuration.html index 2d96cde6e..bf6b6f286 100644 --- a/docs/4/server/configuration.html +++ b/docs/4/server/configuration.html @@ -15,8 +15,8 @@ - - + +

    Configure Centrifugo

    Let's look at how Centrifugo can be configured.

    diff --git a/docs/4/server/console_commands.html b/docs/4/server/console_commands.html index 615f408fc..53a2bce13 100644 --- a/docs/4/server/console_commands.html +++ b/docs/4/server/console_commands.html @@ -15,8 +15,8 @@ - - + +

    Helper CLI commands

    Here is a list of helpful command-line commands that come with Centrifugo executable.

    diff --git a/docs/4/server/engines.html b/docs/4/server/engines.html index 85e1998d5..4cef8087d 100644 --- a/docs/4/server/engines.html +++ b/docs/4/server/engines.html @@ -15,8 +15,8 @@ - - + +

    Engines and scalability

    The Engine in Centrifugo is responsible for publishing messages between nodes, handle PUB/SUB broker subscriptions, save/retrieve online presence and history data.

    diff --git a/docs/4/server/history_and_recovery.html b/docs/4/server/history_and_recovery.html index 446c94642..2b40a4dcd 100644 --- a/docs/4/server/history_and_recovery.html +++ b/docs/4/server/history_and_recovery.html @@ -15,8 +15,8 @@ - - + +

    History and recovery

    Centrifugo engines can maintain publication history for channels with configured history size and TTL.

    diff --git a/docs/4/server/infra_tuning.html b/docs/4/server/infra_tuning.html index f9bfe070e..09215280b 100644 --- a/docs/4/server/infra_tuning.html +++ b/docs/4/server/infra_tuning.html @@ -15,8 +15,8 @@ - - + +

    Infrastructure tuning

    As Centrifugo deals with lots of persistent connections your operating system and server infrastructure must be ready for it.

    diff --git a/docs/4/server/load_balancing.html b/docs/4/server/load_balancing.html index 6907f8e8d..0ff39a30c 100644 --- a/docs/4/server/load_balancing.html +++ b/docs/4/server/load_balancing.html @@ -15,8 +15,8 @@ - - + +

    Load balancing

    This chapter shows how to deal with persistent connection load balancing.

    diff --git a/docs/4/server/monitoring.html b/docs/4/server/monitoring.html index a878e6527..8ce8bb3a2 100644 --- a/docs/4/server/monitoring.html +++ b/docs/4/server/monitoring.html @@ -15,8 +15,8 @@ - - + +

    Metrics monitoring

    Centrifugo supports reporting metrics in Prometheus format and can automatically export metrics to Graphite.

    diff --git a/docs/4/server/presence.html b/docs/4/server/presence.html index 0863cd95d..8ccc46dc4 100644 --- a/docs/4/server/presence.html +++ b/docs/4/server/presence.html @@ -15,8 +15,8 @@ - - + +

    Online presence

    The online presence feature of Centrifugo is a powerful tool that allows you to monitor and manage active users in real-time on a specific channel. It provides live data about which users are currently connected to your application.

    diff --git a/docs/4/server/proxy.html b/docs/4/server/proxy.html index fd4f6624c..e9cc43c0e 100644 --- a/docs/4/server/proxy.html +++ b/docs/4/server/proxy.html @@ -15,8 +15,8 @@ - - + +

    Proxy events to the backend

    It's possible to proxy some client connection events from Centrifugo to the application backend and react to them in a custom way. For example, it's possible to authenticate connection via request from Centrifugo to application backend, refresh client sessions and answer to RPC calls sent by a client over bidirectional connection. Also, you may control subscription and publication permissions using these hooks.

    diff --git a/docs/4/server/server_api.html b/docs/4/server/server_api.html index 58f10e031..d307156f1 100644 --- a/docs/4/server/server_api.html +++ b/docs/4/server/server_api.html @@ -15,8 +15,8 @@ - - + +

    Server API walkthrough

    Server API provides a way to send various commands to Centrifugo. For example, server API allows publishing messages to channels, get server statistics, etc. There are two kinds of API available at the moment:

    diff --git a/docs/4/server/server_subs.html b/docs/4/server/server_subs.html index 6b2095c02..6e8023f4f 100644 --- a/docs/4/server/server_subs.html +++ b/docs/4/server/server_subs.html @@ -15,8 +15,8 @@ - - + +

    Server-side subscriptions

    Centrifugo clients can initiate a subscription to a channel by calling the subscribe method of client API. In most cases, client-side subscriptions is a more flexible and recommended approach since a frontend usually knows which channels it needs to consume at a concrete moment.

    diff --git a/docs/4/server/tls.html b/docs/4/server/tls.html index 9970e988d..5bc7c7a54 100644 --- a/docs/4/server/tls.html +++ b/docs/4/server/tls.html @@ -15,8 +15,8 @@ - - + +

    Configure TLS

    TLS/SSL layer is very important not only for securing your connections but also to increase a diff --git a/docs/4/transports/client_api.html b/docs/4/transports/client_api.html index 87942a545..3211d8658 100644 --- a/docs/4/transports/client_api.html +++ b/docs/4/transports/client_api.html @@ -15,8 +15,8 @@ - - + +

    Client SDK API

    Centrifugo has several client SDKs to establish a real-time connection with a server. Centrifugo SDKs use WebSocket as the main data transport and send/receive messages encoded according to our bidirectional protocol. That protocol is built on top of the Protobuf schema (both JSON and binary Protobuf formats are supported). It provides asynchronous communication, sending RPC, multiplexing subscriptions to channels, etc. Client SDK wraps the protocol and exposes a set of APIs to developers.

    diff --git a/docs/4/transports/client_protocol.html b/docs/4/transports/client_protocol.html index cc05571c3..e42e1d480 100644 --- a/docs/4/transports/client_protocol.html +++ b/docs/4/transports/client_protocol.html @@ -15,8 +15,8 @@ - - + +

    Client protocol

    This chapter describes the core concepts of Centrifugo bidirectional client protocol – concentrating on framing level. If you want to find out details about exposed client API then look at client API document.

    diff --git a/docs/4/transports/client_sdk.html b/docs/4/transports/client_sdk.html index a6cb8fdaf..b6be41430 100644 --- a/docs/4/transports/client_sdk.html +++ b/docs/4/transports/client_sdk.html @@ -15,8 +15,8 @@ - - + +

    Client real-time SDKs

    In the previous chapter we investigated common principles of Centrifugo client SDK API. Here we will provide a list of available bidirectional connectors you can use to communicate with Centrifugo.

    diff --git a/docs/4/transports/http_stream.html b/docs/4/transports/http_stream.html index 6d3f207bb..f43b88969 100644 --- a/docs/4/transports/http_stream.html +++ b/docs/4/transports/http_stream.html @@ -15,8 +15,8 @@ - - + +

    HTTP streaming, with bidirectional emulation

    HTTP streaming connection endpoint in Centrifugo is:

    diff --git a/docs/4/transports/overview.html b/docs/4/transports/overview.html index 5bf8b01a2..42c4a180a 100644 --- a/docs/4/transports/overview.html +++ b/docs/4/transports/overview.html @@ -15,8 +15,8 @@ - - + +

    Real-time transports

    Centrifugo supports a variety of transports to deliver real-time messages to clients.

    diff --git a/docs/4/transports/sockjs.html b/docs/4/transports/sockjs.html index f46a3c487..172730d53 100644 --- a/docs/4/transports/sockjs.html +++ b/docs/4/transports/sockjs.html @@ -15,8 +15,8 @@ - - + +

    SockJS

    SockJS is a polyfill browser library which provides HTTP-based fallback transports in case when it's not possible to establish Websocket connection. This can happen in old client browsers or because of some proxy behind client and server that cuts of Websocket traffic. You can find more information on SockJS project Github page.

    diff --git a/docs/4/transports/sse.html b/docs/4/transports/sse.html index ddd5ef8e2..123b9cb25 100644 --- a/docs/4/transports/sse.html +++ b/docs/4/transports/sse.html @@ -15,8 +15,8 @@ - - + +

    SSE (EventSource), with bidirectional emulation

    SSE (EventSource) connection endpoint in Centrifugo is:

    diff --git a/docs/4/transports/uni_grpc.html b/docs/4/transports/uni_grpc.html index 147785cee..4425e52b1 100644 --- a/docs/4/transports/uni_grpc.html +++ b/docs/4/transports/uni_grpc.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional GRPC

    It's possible to connect to GRPC unidirectional stream to consume real-time messages from Centrifugo. In this case you need to generate GRPC code for your language on client-side.

    diff --git a/docs/4/transports/uni_http_stream.html b/docs/4/transports/uni_http_stream.html index 8b5033c29..273f81096 100644 --- a/docs/4/transports/uni_http_stream.html +++ b/docs/4/transports/uni_http_stream.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional HTTP streaming

    Default unidirectional HTTP streaming connection endpoint in Centrifugo is:

    diff --git a/docs/4/transports/uni_sse.html b/docs/4/transports/uni_sse.html index ec0250544..1ad6d497b 100644 --- a/docs/4/transports/uni_sse.html +++ b/docs/4/transports/uni_sse.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional SSE (EventSource)

    Default unidirectional SSE (EventSource) connection endpoint in Centrifugo is:

    diff --git a/docs/4/transports/uni_websocket.html b/docs/4/transports/uni_websocket.html index ec23e8892..fbeb95e1c 100644 --- a/docs/4/transports/uni_websocket.html +++ b/docs/4/transports/uni_websocket.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional WebSocket

    Default unidirectional WebSocket connection endpoint in Centrifugo is:

    diff --git a/docs/4/transports/websocket.html b/docs/4/transports/websocket.html index df9c68a09..db315b40b 100644 --- a/docs/4/transports/websocket.html +++ b/docs/4/transports/websocket.html @@ -15,8 +15,8 @@ - - + +

    WebSocket

    Websocket is the main transport in Centrifugo. It's a very efficient low-overhead protocol on top of TCP.

    diff --git a/docs/4/transports/webtransport.html b/docs/4/transports/webtransport.html index a213515d9..17833ede5 100644 --- a/docs/4/transports/webtransport.html +++ b/docs/4/transports/webtransport.html @@ -15,8 +15,8 @@ - - + +

    WebTransport

    WebTransport is an API offering low-latency, bidirectional, client-server messaging on top of HTTP/3. See Using WebTransport article that gives a good overview of it.

    diff --git a/docs/attributions.html b/docs/attributions.html index 4207fc340..c36ba3622 100644 --- a/docs/attributions.html +++ b/docs/attributions.html @@ -15,8 +15,8 @@ - - + +

    Attributions

    Landing Page Images

    diff --git a/docs/faq.html b/docs/faq.html index 99cbaf939..c34ec7ce3 100644 --- a/docs/faq.html +++ b/docs/faq.html @@ -15,8 +15,8 @@ - - + +

    Frequently Asked Questions

    Answers to popular questions here.

    diff --git a/docs/flow_diagrams.html b/docs/flow_diagrams.html index 7d9c52cf6..470275272 100644 --- a/docs/flow_diagrams.html +++ b/docs/flow_diagrams.html @@ -15,8 +15,8 @@ - - + +

    flow_diagrams

    For swimlanes.io:

    diff --git a/docs/getting-started/community.html b/docs/getting-started/community.html index c8c819d7f..7964c9561 100644 --- a/docs/getting-started/community.html +++ b/docs/getting-started/community.html @@ -15,8 +15,8 @@ - - + +

    Join community

    If you find Centrifugo interesting, you are welcome to join our community rooms on Telegram (the most active) and Discord:

    diff --git a/docs/getting-started/comparisons.html b/docs/getting-started/comparisons.html index c3a32f016..8c23635d3 100644 --- a/docs/getting-started/comparisons.html +++ b/docs/getting-started/comparisons.html @@ -15,8 +15,8 @@ - - + +

    Comparing with others

    Let's compare Centrifugo with various systems. These comparisons arose from popular questions raised in our communities. Here we are emphasizing things that make Centrifugo special.

    diff --git a/docs/getting-started/design.html b/docs/getting-started/design.html index fe6ce104a..fa8023a26 100644 --- a/docs/getting-started/design.html +++ b/docs/getting-started/design.html @@ -15,8 +15,8 @@ - - + +

    Design overview

    Let's discuss some architectural and design topics about Centrifugo.

    diff --git a/docs/getting-started/ecosystem.html b/docs/getting-started/ecosystem.html index d6149a2b3..4a63eefa1 100644 --- a/docs/getting-started/ecosystem.html +++ b/docs/getting-started/ecosystem.html @@ -15,8 +15,8 @@ - - + +

    Ecosystem notes

    Some additional notes about our ecosystem which may help you develop with our tech.

    diff --git a/docs/getting-started/highlights.html b/docs/getting-started/highlights.html index dbd7444fb..b3dd9f4ab 100644 --- a/docs/getting-started/highlights.html +++ b/docs/getting-started/highlights.html @@ -15,8 +15,8 @@ - - + +

    Main highlights

    At this point, you know how to build the simplest real-time app with Centrifugo. Beyond the core PUB/SUB functionality, Centrifugo provides more features and primitives to build scalable real-time applications. Let's summarize the main Centrifugo ✨highlights✨ here. Every point is then extended throughout the documentation.

    diff --git a/docs/getting-started/installation.html b/docs/getting-started/installation.html index cdbda7fe6..cb46bea5f 100644 --- a/docs/getting-started/installation.html +++ b/docs/getting-started/installation.html @@ -15,8 +15,8 @@ - - + +

    Install Centrifugo

    Centrifugo server is written in the Go language. It's open-source software, and the source code is available on Github.

    diff --git a/docs/getting-started/integration.html b/docs/getting-started/integration.html index d22478f62..ee806a6ab 100644 --- a/docs/getting-started/integration.html +++ b/docs/getting-started/integration.html @@ -15,8 +15,8 @@ - - + +

    Integration guide

    This chapter aims to help you get started with Centrifugo. We will look at a step-by-step workflow of integrating your application with Centrifugo, providing links to relevant parts of this documentation.

    diff --git a/docs/getting-started/introduction.html b/docs/getting-started/introduction.html index 09fdbdb09..e1bf526aa 100644 --- a/docs/getting-started/introduction.html +++ b/docs/getting-started/introduction.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo introduction

    diff --git a/docs/getting-started/migration_v4.html b/docs/getting-started/migration_v4.html index ebd533684..43af127e1 100644 --- a/docs/getting-started/migration_v4.html +++ b/docs/getting-started/migration_v4.html @@ -15,8 +15,8 @@ - - + +

    Migrating to v4

    Centrifugo v4 development was concentrated around two main things:

    diff --git a/docs/getting-started/migration_v5.html b/docs/getting-started/migration_v5.html index eddd0b625..5bfda4bc5 100644 --- a/docs/getting-started/migration_v5.html +++ b/docs/getting-started/migration_v5.html @@ -15,8 +15,8 @@ - - + +

    Migrating to v5

    Centrifugo v5 migration from v4 should be smooth for most of the use cases.

    diff --git a/docs/getting-started/quickstart.html b/docs/getting-started/quickstart.html index ddeecb330..0e67a1a7b 100644 --- a/docs/getting-started/quickstart.html +++ b/docs/getting-started/quickstart.html @@ -15,8 +15,8 @@ - - + +

    Quickstart tutorial ⏱️

    In this tutorial, we will build a very simple browser application with Centrifugo. Users will connect to Centrifugo over WebSocket, subscribe to a channel, and start receiving all channel publications (messages published to that channel). In our case, we will send a counter value to all channel subscribers to update the counter widget in all open browser tabs in real-time.

    diff --git a/docs/pro/admin_idp_auth.html b/docs/pro/admin_idp_auth.html index bc7e2077c..f18713eaa 100644 --- a/docs/pro/admin_idp_auth.html +++ b/docs/pro/admin_idp_auth.html @@ -15,8 +15,8 @@ - - + +

    SSO for admin UI using OpenID connect (OIDC)

    Admin UI of Centrifugo OSS supports only one admin user identified by the preconfigured password. For the corporate and enterprise environments Centrifugo PRO provides a way to integrate with popular User Identity Providers (IDP), such as Okta, KeyCloak, Google Workspace, Azure and others. Most of the modern providers which support OpenID connect (OIDC) protocol with Proof Key for Code Exchange diff --git a/docs/pro/analytics.html b/docs/pro/analytics.html index e56926f17..83b5944d6 100644 --- a/docs/pro/analytics.html +++ b/docs/pro/analytics.html @@ -15,8 +15,8 @@ - - + +

    Analytics with ClickHouse

    This feature allows exporting information about channel publications, client connections, channel subscriptions, client operations and push notifications to ClickHouse thus providing an integration with a real-time (with seconds delay) analytics storage. ClickHouse is super fast for analytical queries, simple to operate with and it allows effective data keeping for a window of time. Also, it's relatively simple to create a high performance ClickHouse cluster.

    diff --git a/docs/pro/capabilities.html b/docs/pro/capabilities.html index bbf41d2a1..7a632b450 100644 --- a/docs/pro/capabilities.html +++ b/docs/pro/capabilities.html @@ -15,8 +15,8 @@ - - + +

    Channel capabilities

    At this point you know that Centrifugo allows configuring channel permissions on a per-namespace level. When creating a new real-time feature it's recommended to create a new namespace for it and configure permissions. To achieve a better channel permission control inside a namespace Centrifugo PRO provides possibility to set capabilities on individual connection basis, or individual channel subscription basis.

    diff --git a/docs/pro/cel_expressions.html b/docs/pro/cel_expressions.html index 465018ff2..da852738d 100644 --- a/docs/pro/cel_expressions.html +++ b/docs/pro/cel_expressions.html @@ -15,8 +15,8 @@ - - + +

    Channel CEL expressions

    Centrifugo PRO supports CEL expressions (Common Expression Language) for checking channel operation permissions.

    diff --git a/docs/pro/channel_patterns.html b/docs/pro/channel_patterns.html index b150f3730..83c99d09c 100644 --- a/docs/pro/channel_patterns.html +++ b/docs/pro/channel_patterns.html @@ -15,8 +15,8 @@ - - + +

    Channel patterns

    Centrifugo PRO enhances a way to configure channels with Channel Patterns feature. This opens a road for building channel model similar to what developers got used to when writing HTTP servers and configuring routes for HTTP request processing.

    diff --git a/docs/pro/channel_state_events.html b/docs/pro/channel_state_events.html index bb314af0b..c946361ba 100644 --- a/docs/pro/channel_state_events.html +++ b/docs/pro/channel_state_events.html @@ -15,8 +15,8 @@ - - + +

    Channel state events

    Centrifugo PRO has a feature to enable channel state event webhooks to be sent to your configured backend endpoint:

    diff --git a/docs/pro/client_message_batching.html b/docs/pro/client_message_batching.html index 07347d359..5bfbb3b70 100644 --- a/docs/pro/client_message_batching.html +++ b/docs/pro/client_message_batching.html @@ -15,8 +15,8 @@ - - + +

    Message batching control

    Centrifugo PRO provides advanced options to tweak connection message write behaviour.

    diff --git a/docs/pro/connections.html b/docs/pro/connections.html index d3479a3ab..d0269f9f4 100644 --- a/docs/pro/connections.html +++ b/docs/pro/connections.html @@ -15,8 +15,8 @@ - - + +

    Connections API

    Centrifugo PRO offers an extra API call, connections, which enables retrieval of all active sessions (based on user ID or expression) without the need to activate the presence feature for channels. Furthermore, developers can attach any desired JSON payload to a connection that will then be visible in the result of the connections call. It's worth noting that this additional meta-information remains hidden from the client-side, unlike the info associated with the connection.

    diff --git a/docs/pro/distributed_rate_limit.html b/docs/pro/distributed_rate_limit.html index 21b7ac681..76282d269 100644 --- a/docs/pro/distributed_rate_limit.html +++ b/docs/pro/distributed_rate_limit.html @@ -15,8 +15,8 @@ - - + +

    Distributed rate limit API

    In addition to connection operation rate limiting features Centrifugo PRO provides a generic high precision rate limiting API. It may be used for custom quota managing tasks not even related to real-time connections. Its distributed nature allows managing quotas across different instances of your application backend.

    diff --git a/docs/pro/install_and_run.html b/docs/pro/install_and_run.html index c94fb4e43..fec3db91d 100644 --- a/docs/pro/install_and_run.html +++ b/docs/pro/install_and_run.html @@ -15,8 +15,8 @@ - - + +

    Install and run PRO version

    Centrifugo PRO license agreement

    Centrifugo PRO is distributed by Centrifugal Labs LTD under commercial license which is different from OSS version. By downloading Centrifugo PRO you automatically accept commercial license terms.

    diff --git a/docs/pro/observability_enhancements.html b/docs/pro/observability_enhancements.html index 7b4c6e6a8..f2deb43f0 100644 --- a/docs/pro/observability_enhancements.html +++ b/docs/pro/observability_enhancements.html @@ -15,8 +15,8 @@ - - + +

    Observability enhancements

    Centrifugo PRO has some enhancements to exposed metrics. At this moment it provides channel namespace resolution to the following metrics:

    diff --git a/docs/pro/overview.html b/docs/pro/overview.html index f5cc9078a..a82eeb341 100644 --- a/docs/pro/overview.html +++ b/docs/pro/overview.html @@ -15,8 +15,8 @@ - - + +

    Centrifugo PRO

    diff --git a/docs/pro/performance.html b/docs/pro/performance.html index 85e7df341..1e7580903 100644 --- a/docs/pro/performance.html +++ b/docs/pro/performance.html @@ -15,8 +15,8 @@ - - + +

    Faster performance

    diff --git a/docs/pro/process_stats.html b/docs/pro/process_stats.html index 5b203e7c9..a716afaa9 100644 --- a/docs/pro/process_stats.html +++ b/docs/pro/process_stats.html @@ -15,8 +15,8 @@ - - + +

    CPU and RSS stats

    A useful addition of Centrifugo PRO is an ability to show CPU and RSS memory usage of each node in admin web UI.

    diff --git a/docs/pro/push_notifications.html b/docs/pro/push_notifications.html index adda32d86..2ac4012c9 100644 --- a/docs/pro/push_notifications.html +++ b/docs/pro/push_notifications.html @@ -15,8 +15,8 @@ - - + +

    Push notification API

    Centrifugo excels in delivering real-time in-app messages to online users. Sometimes though you need a way to engage offline users to come back to your app. Or trigger some update in the app while it's running in the background. That's where push notifications may be used. Push notifications delivered over battery-efficient platform-dependent transport.

    diff --git a/docs/pro/rate_limiting.html b/docs/pro/rate_limiting.html index dca38d330..549f28c71 100644 --- a/docs/pro/rate_limiting.html +++ b/docs/pro/rate_limiting.html @@ -15,8 +15,8 @@ - - + +

    Operation rate limits

    The rate limit feature allows limiting the number of operations each connection or user can issue during a configured time interval. This is useful to protect the system from misusing, detecting and disconnecting abusive or broken (due to the bug in the frontend application) clients which add unwanted load on a server.

    diff --git a/docs/pro/singleflight.html b/docs/pro/singleflight.html index bf752b1b8..a1066d540 100644 --- a/docs/pro/singleflight.html +++ b/docs/pro/singleflight.html @@ -15,8 +15,8 @@ - - + +

    Singleflight

    Centrifugo PRO provides an additional boolean option use_singleflight (default false). When this option enabled Centrifugo will automatically try to merge identical requests to history, online presence or presence stats issued at the same time into one real network request. It will do this by using in-memory component called singleflight.

    diff --git a/docs/pro/token_revocation.html b/docs/pro/token_revocation.html index c84ff8050..47bd76d38 100644 --- a/docs/pro/token_revocation.html +++ b/docs/pro/token_revocation.html @@ -15,8 +15,8 @@ - - + +

    Token revocation API

    One more protective instrument in Centrifugo PRO is API to manage token revocations.

    diff --git a/docs/pro/tracing.html b/docs/pro/tracing.html index 326df4e4b..ee5c56d96 100644 --- a/docs/pro/tracing.html +++ b/docs/pro/tracing.html @@ -15,8 +15,8 @@ - - + +

    User and channel tracing

    That's a unique thing. The tracing feature of Centrifugo PRO allows attaching to any channel to see all messages flying towards subscribers or attach to a specific user ID to see all user-related events in real-time.

    diff --git a/docs/pro/user_block.html b/docs/pro/user_block.html index 3c3bcfbfe..b08c16467 100644 --- a/docs/pro/user_block.html +++ b/docs/pro/user_block.html @@ -15,8 +15,8 @@ - - + +

    User blocking API

    One additional instrument for making protective actions in Centrifugo PRO is user blocking API which allows blocking a specific user on Centrifugo level.

    diff --git a/docs/pro/user_status.html b/docs/pro/user_status.html index ec0a8184c..4eb19388c 100644 --- a/docs/pro/user_status.html +++ b/docs/pro/user_status.html @@ -15,8 +15,8 @@ - - + +

    User status API

    Centrifugo OSS provides a presence feature for channels. It works well (for channels with reasonably small number of active subscribers though), but sometimes you may need a bit different functionality.

    diff --git a/docs/server/admin_web.html b/docs/server/admin_web.html index 727514741..f4b8f38d8 100644 --- a/docs/server/admin_web.html +++ b/docs/server/admin_web.html @@ -15,8 +15,8 @@ - - + +

    Admin web UI

    Centrifugo comes with a built-in administrative web interface. It enables users to:

    diff --git a/docs/server/authentication.html b/docs/server/authentication.html index 5ca99ea50..f5b4b11a3 100644 --- a/docs/server/authentication.html +++ b/docs/server/authentication.html @@ -15,8 +15,8 @@ - - + +

    Client JWT authentication

    To authenticate an incoming connection (client), Centrifugo can use a JSON Web Token (JWT) provided by your application backend to the client-side. This allows Centrifugo to identify the user ID within your application in a secure way. Also, the application can pass additional data to Centrifugo inside JWT claims. This chapter explains this authentication mechanism.

    diff --git a/docs/server/channel_permissions.html b/docs/server/channel_permissions.html index c1a23fa44..a99fe1d7e 100644 --- a/docs/server/channel_permissions.html +++ b/docs/server/channel_permissions.html @@ -15,8 +15,8 @@ - - + +

    Channel permission model

    When using Centrifugo server API you don't need to think about channel permissions at all – everything is allowed. In server API case, request to Centrifugo must be issued by your application backend – so you have all the power to check any required permissions before issuing API request to Centrifugo.

    diff --git a/docs/server/channel_token_auth.html b/docs/server/channel_token_auth.html index 5d523acca..e0b542ac7 100644 --- a/docs/server/channel_token_auth.html +++ b/docs/server/channel_token_auth.html @@ -15,8 +15,8 @@ - - + +

    Channel JWT authorization

    In the chapter about channel permissions we mentioned that to subscribe on a channel client can provide subscription token. This chapter has more information about the subscription token mechanism in Centrifugo.

    diff --git a/docs/server/channels.html b/docs/server/channels.html index 7f91cf79e..ff3bb917d 100644 --- a/docs/server/channels.html +++ b/docs/server/channels.html @@ -15,8 +15,8 @@ - - + +

    Channels and namespaces

    Upon connecting to a server, clients can subscribe to channels. A channel is one of the core concepts of Centrifugo. Most of the time when integrating Centrifugo, you will work with channels and determine the optimal channel configuration for your application.

    diff --git a/docs/server/codes.html b/docs/server/codes.html index eb96aecfa..d2df9b966 100644 --- a/docs/server/codes.html +++ b/docs/server/codes.html @@ -15,8 +15,8 @@ - - + +

    Error and disconnect codes

    This chapter describes error and disconnect codes Centrifugo uses in a client protocol, also error codes which a server API can return in response.

    diff --git a/docs/server/configuration.html b/docs/server/configuration.html index bd01ac80c..5ef8c42ec 100644 --- a/docs/server/configuration.html +++ b/docs/server/configuration.html @@ -15,8 +15,8 @@ - - + +

    Configure Centrifugo

    Let's look at how Centrifugo can be configured.

    diff --git a/docs/server/console_commands.html b/docs/server/console_commands.html index 295ea5482..e12cf6361 100644 --- a/docs/server/console_commands.html +++ b/docs/server/console_commands.html @@ -15,8 +15,8 @@ - - + +

    Helper CLI commands

    Here is a list of helpful command-line commands that come with Centrifugo executable.

    diff --git a/docs/server/consumers.html b/docs/server/consumers.html index 0e908a9cc..bd0f6c436 100644 --- a/docs/server/consumers.html +++ b/docs/server/consumers.html @@ -15,8 +15,8 @@ - - + +

    Built-in API command async consumers

    In server API chapter we've shown how to execute various Centrifugo server API commands (publish, broadcast, etc.) over HTTP or GRPC. In many cases you will call those APIs from your application business logic synchronously. But to deal with temporary network and availability issues, and achieve reliable execution of API commands upon changes in your primary application database you may want to use queuing techniques and call Centrifugo API asynchronously.

    diff --git a/docs/server/engines.html b/docs/server/engines.html index 90520df30..5d89e6d98 100644 --- a/docs/server/engines.html +++ b/docs/server/engines.html @@ -15,8 +15,8 @@ - - + +

    Engines and scalability

    The Engine in Centrifugo is responsible for publishing messages between nodes, handle PUB/SUB broker subscriptions, save/retrieve online presence and history data.

    diff --git a/docs/server/history_and_recovery.html b/docs/server/history_and_recovery.html index 6b539eb1c..d2ddeb33a 100644 --- a/docs/server/history_and_recovery.html +++ b/docs/server/history_and_recovery.html @@ -15,8 +15,8 @@ - - + +

    History and recovery

    Centrifugo engines can maintain publication history for channels with configured history size and TTL.

    diff --git a/docs/server/infra_tuning.html b/docs/server/infra_tuning.html index ca256491e..2c82754d0 100644 --- a/docs/server/infra_tuning.html +++ b/docs/server/infra_tuning.html @@ -15,8 +15,8 @@ - - + +

    Infrastructure tuning

    As Centrifugo deals with lots of persistent connections your operating system and server infrastructure must be ready for it.

    diff --git a/docs/server/load_balancing.html b/docs/server/load_balancing.html index 44951b4b8..e9c080816 100644 --- a/docs/server/load_balancing.html +++ b/docs/server/load_balancing.html @@ -15,8 +15,8 @@ - - + +

    Load balancing

    This chapter shows how to deal with persistent connection load balancing.

    diff --git a/docs/server/monitoring.html b/docs/server/monitoring.html index aa9fe30f6..4b9356c5e 100644 --- a/docs/server/monitoring.html +++ b/docs/server/monitoring.html @@ -15,8 +15,8 @@ - - + +

    Metrics monitoring

    Centrifugo supports reporting metrics in Prometheus format and can automatically export metrics to Graphite.

    diff --git a/docs/server/observability.html b/docs/server/observability.html index d83a98a2c..fefa764f7 100644 --- a/docs/server/observability.html +++ b/docs/server/observability.html @@ -15,8 +15,8 @@ - - + +

    Server observability

    To provide a better server observability Centrifugo supports reporting metrics in Prometheus format and can automatically export metrics to Graphite.

    diff --git a/docs/server/presence.html b/docs/server/presence.html index 981c2c0e5..d725e25f0 100644 --- a/docs/server/presence.html +++ b/docs/server/presence.html @@ -15,8 +15,8 @@ - - + +

    Online presence

    The online presence feature of Centrifugo is a powerful tool that allows you to monitor and manage active users inside a specific channel. It provides an instantaneous snapshot of users currently subscribed to a specific channel. Additionally, Centrifugo may emit join and leave events when clients subscribe to channel and unsubscribe from it.

    diff --git a/docs/server/proxy.html b/docs/server/proxy.html index af15946cd..e4da6e9cd 100644 --- a/docs/server/proxy.html +++ b/docs/server/proxy.html @@ -15,8 +15,8 @@ - - + +

    Proxy events to the backend

    It's possible to proxy some client connection events from Centrifugo to the application backend and react to them in a custom way. For example, it's possible to authenticate connection via request from Centrifugo to application backend, refresh client sessions and answer to RPC calls sent by a client over bidirectional connection. Also, you may control subscription and publication permissions using these hooks.

    diff --git a/docs/server/proxy_streams.html b/docs/server/proxy_streams.html index 4f2f1c93b..a9abd836e 100644 --- a/docs/server/proxy_streams.html +++ b/docs/server/proxy_streams.html @@ -15,8 +15,8 @@ - - + +

    Proxy subscription streams

    Experimental

    This is an experimental extension of Centrifugo proxy. We appreciate your feedback to make sure it's useful and solves real-world problems before marking it as stable and commit to the API.

    diff --git a/docs/server/server_api.html b/docs/server/server_api.html index a63513813..460921f2e 100644 --- a/docs/server/server_api.html +++ b/docs/server/server_api.html @@ -15,8 +15,8 @@ - - + +

    Server API walkthrough

    Server API provides different methods to interact with Centrifugo. Specifically, in most cases this is an entry point for publications into channels coming from your application backend. There are two kinds of server API available at the moment:

    diff --git a/docs/server/server_subs.html b/docs/server/server_subs.html index a376573b6..51d256616 100644 --- a/docs/server/server_subs.html +++ b/docs/server/server_subs.html @@ -15,8 +15,8 @@ - - + +

    Server-side subscriptions

    Centrifugo clients can initiate a subscription to a channel by calling the subscribe method of client API. In most cases, client-side subscriptions is a more flexible and recommended approach since a frontend usually knows which channels it needs to consume at a concrete moment.

    diff --git a/docs/server/tls.html b/docs/server/tls.html index b01e151f4..503cb50eb 100644 --- a/docs/server/tls.html +++ b/docs/server/tls.html @@ -15,8 +15,8 @@ - - + +

    Configure TLS

    TLS/SSL layer is very important not only for securing your connections but also to increase a diff --git a/docs/transports/client_api.html b/docs/transports/client_api.html index e6230228b..e3d27e9d8 100644 --- a/docs/transports/client_api.html +++ b/docs/transports/client_api.html @@ -15,8 +15,8 @@ - - + +

    Client SDK API

    Centrifugo has several client SDKs to establish a real-time connection with a server. Centrifugo SDKs use WebSocket as the main data transport and send/receive messages encoded according to our bidirectional protocol. That protocol is built on top of the Protobuf schema (both JSON and binary Protobuf formats are supported). It provides asynchronous communication, sending RPC, multiplexing subscriptions to channels, etc. Client SDK wraps the protocol and exposes a set of APIs to developers.

    diff --git a/docs/transports/client_protocol.html b/docs/transports/client_protocol.html index f63f72fee..8d03199fd 100644 --- a/docs/transports/client_protocol.html +++ b/docs/transports/client_protocol.html @@ -15,8 +15,8 @@ - - + +

    Client protocol

    This chapter describes the core concepts of Centrifugo bidirectional client protocol – concentrating on framing level. If you want to find out details about exposed client API then look at client API document.

    diff --git a/docs/transports/client_sdk.html b/docs/transports/client_sdk.html index e751e239e..dabaa918a 100644 --- a/docs/transports/client_sdk.html +++ b/docs/transports/client_sdk.html @@ -15,8 +15,8 @@ - - + +

    Client real-time SDKs

    In the previous chapter we investigated common principles of Centrifugo client SDK API. Here we will provide a list of available bidirectional connectors you can use to communicate with Centrifugo.

    diff --git a/docs/transports/http_stream.html b/docs/transports/http_stream.html index 2c9a4381a..005a4d01d 100644 --- a/docs/transports/http_stream.html +++ b/docs/transports/http_stream.html @@ -15,8 +15,8 @@ - - + +

    HTTP streaming, with bidirectional emulation

    HTTP streaming is a technique based on using a long-lived HTTP connection between a client and a server with a chunked transfer encoding. Usually it only allows unidirectional flow of messages from server to client but with Centrifugo bidirectional emulation layer it may be used as a full-featured fallback or alternative to WebSocket.

    diff --git a/docs/transports/overview.html b/docs/transports/overview.html index 17bedc66d..0149aa14e 100644 --- a/docs/transports/overview.html +++ b/docs/transports/overview.html @@ -15,8 +15,8 @@ - - + +

    Real-time transports

    Centrifugo supports a variety of transports to deliver real-time messages to clients.

    diff --git a/docs/transports/sockjs.html b/docs/transports/sockjs.html index 867476d4c..56609504b 100644 --- a/docs/transports/sockjs.html +++ b/docs/transports/sockjs.html @@ -15,8 +15,8 @@ - - + +

    SockJS

    SockJS is a polyfill browser library which provides HTTP-based fallback transports in case when it's not possible to establish Websocket connection. This can happen in old client browsers or because of some proxy behind client and server that cuts of Websocket traffic. You can find more information on SockJS project Github page.

    diff --git a/docs/transports/sse.html b/docs/transports/sse.html index f98197cf0..c3510fabf 100644 --- a/docs/transports/sse.html +++ b/docs/transports/sse.html @@ -15,8 +15,8 @@ - - + +

    SSE (EventSource), with bidirectional emulation

    Server-Sent Events or EventSource is a well-known HTTP-based transport available in all modern browsers and loved by many developers. It's unidirectional in its nature but with Centrifugo bidirectional emulation layer it may be used as a fallback or alternative to WebSocket.

    diff --git a/docs/transports/uni_client_protocol.html b/docs/transports/uni_client_protocol.html index 3a30be49f..34b69b4dd 100644 --- a/docs/transports/uni_client_protocol.html +++ b/docs/transports/uni_client_protocol.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional client protocol

    As we mentioned in overview you can avoid using Centrifugo SDKs if you stick with unidirectional approach. In this case though you will need to implement some basic parsing on client side to consume message types sent by Centrifugo into unidirectional connections.

    diff --git a/docs/transports/uni_grpc.html b/docs/transports/uni_grpc.html index ac34dbd4b..7ce4ce46b 100644 --- a/docs/transports/uni_grpc.html +++ b/docs/transports/uni_grpc.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional GRPC

    It's possible to connect to GRPC unidirectional stream to consume real-time messages from Centrifugo. In this case you need to generate GRPC code for your language on client-side.

    diff --git a/docs/transports/uni_http_stream.html b/docs/transports/uni_http_stream.html index 5ddb43034..e7e642316 100644 --- a/docs/transports/uni_http_stream.html +++ b/docs/transports/uni_http_stream.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional HTTP streaming

    HTTP streaming is a technique based on using a long-lived HTTP connection between a client and a server with a chunked transfer encoding. These days it's possible to use it from the web browser using modern Fetch and Readable Streams API.

    diff --git a/docs/transports/uni_sse.html b/docs/transports/uni_sse.html index 637718dd5..ac5aea847 100644 --- a/docs/transports/uni_sse.html +++ b/docs/transports/uni_sse.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional SSE (EventSource)

    Server-Sent Events or EventSource is a well-known HTTP-based transport available in all modern browsers and loved by many developers.

    diff --git a/docs/transports/uni_websocket.html b/docs/transports/uni_websocket.html index abc77b038..e51b15068 100644 --- a/docs/transports/uni_websocket.html +++ b/docs/transports/uni_websocket.html @@ -15,8 +15,8 @@ - - + +

    Unidirectional WebSocket

    Default unidirectional WebSocket connection endpoint in Centrifugo is:

    diff --git a/docs/transports/websocket.html b/docs/transports/websocket.html index d7312b22c..05c5213d0 100644 --- a/docs/transports/websocket.html +++ b/docs/transports/websocket.html @@ -15,8 +15,8 @@ - - + +

    WebSocket

    Websocket is the main transport in Centrifugo. It's a very efficient low-overhead protocol on top of TCP.

    diff --git a/docs/transports/webtransport.html b/docs/transports/webtransport.html index 9af577e04..1c1cd1170 100644 --- a/docs/transports/webtransport.html +++ b/docs/transports/webtransport.html @@ -15,8 +15,8 @@ - - + +

    WebTransport

    WebTransport is an API offering low-latency, bidirectional, client-server messaging on top of HTTP/3 (with QUIC under the hood). See Using WebTransport article that gives a good overview of it.

    diff --git a/docs/tutorial/backend.html b/docs/tutorial/backend.html index ad529ea4e..fae02c5f8 100644 --- a/docs/tutorial/backend.html +++ b/docs/tutorial/backend.html @@ -15,8 +15,8 @@ - - + +

    Setting up backend and database

    Let's start building the app. As the first step, create a directory for the new app:

    diff --git a/docs/tutorial/centrifugo.html b/docs/tutorial/centrifugo.html index e7d1b8038..23e2bd630 100644 --- a/docs/tutorial/centrifugo.html +++ b/docs/tutorial/centrifugo.html @@ -15,8 +15,8 @@ - - + +

    Integrating Centrifugo for real-time event delivery

    It's finally time for the real-time! In some cases you already have an application and when integrating Centrifugo you start from here.

    diff --git a/docs/tutorial/frontend.html b/docs/tutorial/frontend.html index 7de0e9347..07350bb09 100644 --- a/docs/tutorial/frontend.html +++ b/docs/tutorial/frontend.html @@ -15,8 +15,8 @@ - - + +

    Creating SPA frontend with React

    On the frontend we will use Vite with React and Typescript. In this tutorial we are not paying a lot of attention to making all the types strict and using any a lot. Which is actually a point for improvement, but at least helps to make the tutorial slightly shorter. The prerequisites is NodeJS >= 18.

    diff --git a/docs/tutorial/improvements.html b/docs/tutorial/improvements.html index 84fed46c2..f184602ff 100644 --- a/docs/tutorial/improvements.html +++ b/docs/tutorial/improvements.html @@ -15,8 +15,8 @@ - - + +

    Appendix #1: Possible Improvements

    There are still many areas for improvement in GrandChat, but we had to halt at a certain point to prevent the tutorial from becoming a book. If you enjoyed the tutorial and wish to enhance GrandChat further, here are some bright ideas:

    diff --git a/docs/tutorial/intro.html b/docs/tutorial/intro.html index 9f9591bae..f9d78083b 100644 --- a/docs/tutorial/intro.html +++ b/docs/tutorial/intro.html @@ -15,8 +15,8 @@ - - + +

    Building WebSocket chat (messenger) app from scratch

    In this tutorial, we show how to build a rather complex real-time application with Centrifugo. It features a modern and responsive frontend, user authentication, channel permission checks, and the main database as a source of truth.

    diff --git a/docs/tutorial/layout.html b/docs/tutorial/layout.html index 63c5a1224..bb054fd20 100644 --- a/docs/tutorial/layout.html +++ b/docs/tutorial/layout.html @@ -15,8 +15,8 @@ - - + +

    App layout and behavior

    Before we start, we would like the reader to be more familiar with the layout and behavior of the application we are creating here. Let's look at it screen by screen, describe the behavior, and explain which parts will be endowed with real-time superpowers.

    diff --git a/docs/tutorial/outbox_cdc.html b/docs/tutorial/outbox_cdc.html index c144fbafa..910c232c1 100644 --- a/docs/tutorial/outbox_cdc.html +++ b/docs/tutorial/outbox_cdc.html @@ -15,8 +15,8 @@ - - + +

    Broadcast using transactional outbox and CDC

    Some of you may notice one potential issue which could prevent event delivery to users when publishing messages to Centrifugo API. Since we do this after a transaction and via a network call (in our case, using HTTP), it means the broadcast API call may return an error.

    diff --git a/docs/tutorial/outro.html b/docs/tutorial/outro.html index 8213509e0..39132033c 100644 --- a/docs/tutorial/outro.html +++ b/docs/tutorial/outro.html @@ -15,8 +15,8 @@ - - + +

    Wrapping up – things learnt

    At this point, we have a working real-time app, so the tutorial comes to an end. We've covered some concepts of Centrifugo, such as:

    diff --git a/docs/tutorial/recovery.html b/docs/tutorial/recovery.html index 474250803..e11d76d7d 100644 --- a/docs/tutorial/recovery.html +++ b/docs/tutorial/recovery.html @@ -15,8 +15,8 @@ - - + +

    Missed messages recovery

    At this point, we already have a real-time application with the instant delivery of events to interested messenger users. Now, let's focus on ensuring reliable message delivery. The first step would be enabling Centrifugo's automatic message recovery for personal channels.

    diff --git a/docs/tutorial/reverse_proxy.html b/docs/tutorial/reverse_proxy.html index 9ad064fd0..22bdfea0d 100644 --- a/docs/tutorial/reverse_proxy.html +++ b/docs/tutorial/reverse_proxy.html @@ -15,8 +15,8 @@ - - + +

    Adding Nginx as a reverse proxy

    As mentioned, we are building a single-page frontend application here, and the frontend will be completely decoupled from the backend. This separation is advantageous because Centrifugo users can theoretically swap only the backend or frontend components while following this tutorial. For example, one could keep the frontend part but attempt to implement the backend in Laravel, Rails, or another framework.

    diff --git a/docs/tutorial/scale.html b/docs/tutorial/scale.html index ae4b15407..f541896dc 100644 --- a/docs/tutorial/scale.html +++ b/docs/tutorial/scale.html @@ -15,8 +15,8 @@ - - + +

    Scale to 100k cats in room

    Congratulations – we've built an awesome app and we are done with the development within this tutorial! 🎉

    diff --git a/docs/tutorial/tips_and_tricks.html b/docs/tutorial/tips_and_tricks.html index 65efc3bf2..e80665802 100644 --- a/docs/tutorial/tips_and_tricks.html +++ b/docs/tutorial/tips_and_tricks.html @@ -15,8 +15,8 @@ - - + +

    Appendix #2: Tips and tricks

    Making this tutorial took quite a lot of time for us. We want to collect some useful tips and tricks here for those who decide to play with the final example. Feel free to contribute if you find something which could help others.

    diff --git a/img/centrifugo_loki.jpg b/img/centrifugo_loki.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0f36c290cb86b8eb2ce51cd4992a2effe86011d GIT binary patch literal 93763 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°|b!Y41{3J(_2;-;g&_cG* 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�fZt$mc-1H#BK_PzOH_2;c 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

    ?%5 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

    KIntk(Ygo%6Kwjxhh#} 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%0AFIZ;}IA*Ay}tW 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 z

    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 UflM}5*u+pM0%nHoe$5R3F9;OQga7~l literal 0 HcmV?d00001 diff --git a/index.html b/index.html index f51c0f2e8..cee4c7b1f 100644 --- a/index.html +++ b/index.html @@ -15,8 +15,8 @@ - - + +

    CENTRIFUGO
    Scalable real-time messaging server. Set up once and forever.
    Integrates with everything

    Integrates with everything

    Centrifugo is a self-hosted service which handles connections over various transports and provides a simple publishing API. Centrifugo nicely integrates with any application — no changes in the existing app architecture required to introduce real-time updates.

    Great performance

    Great performance

    Centrifugo is written in Go language with some smart optimizations inside. See the description of the test stand with one million WebSocket connections and 30 million delivered messages per minute with hardware comparable to a single modern server machine.

    Feature-rich

    Feature-rich

    Centrifugo provides flexible authentication, various types of subscriptions, hot channel history, online presence, the ability to proxy connection events to the backend, and much more. It comes with official SDK libraries for both web and mobile development.

    Out-of-the-box scalability

    Out-of-the-box scalability

    Built-in Redis, KeyDB, Tarantool engines, or Nats broker make it possible to scale connections across different Centrifugo nodes. So Centrifugo helps you to scale to millions of active connections with reasonable hardware requirements.

    Used in production

    Used in production

    Started a decade ago, Centrifugo (and Centrifuge library for Go it's built on top of) is mature, battle-tested software that has been successfully used in production by many companies around the world: VK, Badoo, ManyChat, OpenWeb, Grafana, and others.

    Centrifugo PRO

    Centrifugo PRO

    Centrifugo PRO offers great benefits for corporate and enterprise environments by providing unique features on top of the OSS version: analytics with ClickHouse, real-time tracing, performance optimizations, push notification API, SSO integrations for web UI, etc.

    What is real-time messaging?

    Real-time messaging is used to create interactive applications where events are delivered to online users with minimal delay.

    Chats apps, live comments, multiplayer games, real-time data visualizations, collaborative tools, etc. can all be built on top of a real-time messaging system.

    Centrifugo is a user facing PUB/SUB server that handles persistent connections over various real-time transports — WebSocket, HTTP-streaming, SSE (Server-Sent Events), SockJS, WebTransport, GRPC.

    Looking for a cool demo?

    Here is the real-time telemetry streamed from the Assetto Corsa racing simulator to the Grafana dashboard with a help of our WebSocket technologies.

    This demonstrates that you can stream 60Hz data towards client connections and thus provide instant visual feedback on the state of the system.

    Slack-scale messenger?

    Straightforward with Centrifugo! Even though your backend does not support concurrency. See the tutorial where we build a beautiful messenger app and go beyond usually shown basics.

    Centrifugo is a versatile real-time component – it can be used to build various types of real-time applications, not just messengers.

    Rotating Image

    Are you Enterprise?

    Centrifugal Labs offers a PRO version of Centrifugo that includes a set of unique features, additional APIs, and enhanced performance. Ever dreamed about a self-hosted real-time messaging system combined with a push notification system? Want to benefit from analytics of real-time connections and subscriptions? Centrifugo PRO makes this possible. And much more actually.

    diff --git a/license.html b/license.html index b36b09321..2edbd14c2 100644 --- a/license.html +++ b/license.html @@ -15,8 +15,8 @@ - - + +

    Centrifugal Labs LTD license agreement

    diff --git a/license_exchange_lemon.html b/license_exchange_lemon.html index e10bb43a9..6c6cfe900 100644 --- a/license_exchange_lemon.html +++ b/license_exchange_lemon.html @@ -15,8 +15,8 @@ - - + +

    Thanks for purchasing Centrifugo PRO 🎉

    diff --git a/search.html b/search.html index 20adf923d..7fac57efb 100644 --- a/search.html +++ b/search.html @@ -15,8 +15,8 @@ - - + + diff --git a/sitemap.xml b/sitemap.xml index 742545884..862fd2895 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://centrifugal.dev/blogweekly0.5https://centrifugal.dev/blog/2020/02/10/million-connections-with-centrifugoweekly0.5https://centrifugal.dev/blog/2020/10/16/experimenting-with-quic-transportweekly0.5https://centrifugal.dev/blog/2020/11/12/scaling-websocketweekly0.5https://centrifugal.dev/blog/2021/01/15/centrifuge-introweekly0.5https://centrifugal.dev/blog/2021/08/31/hello-centrifugo-v3weekly0.5https://centrifugal.dev/blog/2021/10/18/integrating-with-nodejsweekly0.5https://centrifugal.dev/blog/2021/11/04/integrating-with-django-building-chat-applicationweekly0.5https://centrifugal.dev/blog/2021/12/14/laravel-multi-room-chat-tutorialweekly0.5https://centrifugal.dev/blog/2022/07/19/centrifugo-v4-releasedweekly0.5https://centrifugal.dev/blog/2022/07/29/101-way-to-subscribeweekly0.5https://centrifugal.dev/blog/2022/12/20/improving-redis-engine-performanceweekly0.5https://centrifugal.dev/blog/2023/03/31/keycloak-sso-centrifugoweekly0.5https://centrifugal.dev/blog/2023/06/29/centrifugo-v5-releasedweekly0.5https://centrifugal.dev/blog/2023/08/19/asynchronous-message-streaming-to-centrifugo-with-benthosweekly0.5https://centrifugal.dev/blog/2023/08/29/using-centrifugo-in-rabbitxweekly0.5https://centrifugal.dev/blog/2023/10/29/discovering-centrifugo-pro-push-notificationsweekly0.5https://centrifugal.dev/blog/archiveweekly0.5https://centrifugal.dev/blog/tagsweekly0.5https://centrifugal.dev/blog/tags/authenticationweekly0.5https://centrifugal.dev/blog/tags/benthosweekly0.5https://centrifugal.dev/blog/tags/centrifugeweekly0.5https://centrifugal.dev/blog/tags/centrifugoweekly0.5https://centrifugal.dev/blog/tags/djangoweekly0.5https://centrifugal.dev/blog/tags/goweekly0.5https://centrifugal.dev/blog/tags/interviewweekly0.5https://centrifugal.dev/blog/tags/keycloakweekly0.5https://centrifugal.dev/blog/tags/laravelweekly0.5https://centrifugal.dev/blog/tags/phpweekly0.5https://centrifugal.dev/blog/tags/proweekly0.5https://centrifugal.dev/blog/tags/proxyweekly0.5https://centrifugal.dev/blog/tags/push-notificationsweekly0.5https://centrifugal.dev/blog/tags/quicweekly0.5https://centrifugal.dev/blog/tags/redisweekly0.5https://centrifugal.dev/blog/tags/releaseweekly0.5https://centrifugal.dev/blog/tags/ssoweekly0.5https://centrifugal.dev/blog/tags/tutorialweekly0.5https://centrifugal.dev/blog/tags/usecaseweekly0.5https://centrifugal.dev/blog/tags/websocketweekly0.5https://centrifugal.dev/blog/tags/webtransportweekly0.5https://centrifugal.dev/components/Highlightweekly0.5https://centrifugal.dev/components/logoweekly0.5https://centrifugal.dev/components/logos/Badooweekly0.5https://centrifugal.dev/components/logos/Grafanaweekly0.5https://centrifugal.dev/components/logos/ManyChatweekly0.5https://centrifugal.dev/components/logos/OpenWebweekly0.5https://centrifugal.dev/licenseweekly0.5https://centrifugal.dev/searchweekly0.5https://centrifugal.dev/docs/3/attributionsweekly0.5https://centrifugal.dev/docs/3/ecosystem/centrifugeweekly0.5https://centrifugal.dev/docs/3/ecosystem/integrationsweekly0.5https://centrifugal.dev/docs/3/faqweekly0.5https://centrifugal.dev/docs/3/flow_diagramsweekly0.5https://centrifugal.dev/docs/3/getting-started/client_apiweekly0.5https://centrifugal.dev/docs/3/getting-started/designweekly0.5https://centrifugal.dev/docs/3/getting-started/highlightsweekly0.5https://centrifugal.dev/docs/3/getting-started/installationweekly0.5https://centrifugal.dev/docs/3/getting-started/integrationweekly0.5https://centrifugal.dev/docs/3/getting-started/introductionweekly0.5https://centrifugal.dev/docs/3/getting-started/migration_v3weekly0.5https://centrifugal.dev/docs/3/getting-started/quickstartweekly0.5https://centrifugal.dev/docs/3/pro/analyticsweekly0.5https://centrifugal.dev/docs/3/pro/db_namespacesweekly0.5https://centrifugal.dev/docs/3/pro/install_and_runweekly0.5https://centrifugal.dev/docs/3/pro/overviewweekly0.5https://centrifugal.dev/docs/3/pro/performanceweekly0.5https://centrifugal.dev/docs/3/pro/process_statsweekly0.5https://centrifugal.dev/docs/3/pro/singleflightweekly0.5https://centrifugal.dev/docs/3/pro/throttlingweekly0.5https://centrifugal.dev/docs/3/pro/token_revocationweekly0.5https://centrifugal.dev/docs/3/pro/tracingweekly0.5https://centrifugal.dev/docs/3/pro/user_blockweekly0.5https://centrifugal.dev/docs/3/pro/user_connectionsweekly0.5https://centrifugal.dev/docs/3/pro/user_statusweekly0.5https://centrifugal.dev/docs/3/server/admin_webweekly0.5https://centrifugal.dev/docs/3/server/authenticationweekly0.5https://centrifugal.dev/docs/3/server/channelsweekly0.5https://centrifugal.dev/docs/3/server/codesweekly0.5https://centrifugal.dev/docs/3/server/configurationweekly0.5https://centrifugal.dev/docs/3/server/console_commandsweekly0.5https://centrifugal.dev/docs/3/server/enginesweekly0.5https://centrifugal.dev/docs/3/server/history_and_recoveryweekly0.5https://centrifugal.dev/docs/3/server/infra_tuningweekly0.5https://centrifugal.dev/docs/3/server/load_balancingweekly0.5https://centrifugal.dev/docs/3/server/monitoringweekly0.5https://centrifugal.dev/docs/3/server/private_channelsweekly0.5https://centrifugal.dev/docs/3/server/proxyweekly0.5https://centrifugal.dev/docs/3/server/server_apiweekly0.5https://centrifugal.dev/docs/3/server/server_subsweekly0.5https://centrifugal.dev/docs/3/server/tlsweekly0.5https://centrifugal.dev/docs/3/transports/client_protocolweekly0.5https://centrifugal.dev/docs/3/transports/client_sdkweekly0.5https://centrifugal.dev/docs/3/transports/overviewweekly0.5https://centrifugal.dev/docs/3/transports/sockjsweekly0.5https://centrifugal.dev/docs/3/transports/uni_grpcweekly0.5https://centrifugal.dev/docs/3/transports/uni_http_streamweekly0.5https://centrifugal.dev/docs/3/transports/uni_sseweekly0.5https://centrifugal.dev/docs/3/transports/uni_websocketweekly0.5https://centrifugal.dev/docs/3/transports/websocketweekly0.5https://centrifugal.dev/docs/4/attributionsweekly0.5https://centrifugal.dev/docs/4/faqweekly0.5https://centrifugal.dev/docs/4/flow_diagramsweekly0.5https://centrifugal.dev/docs/4/getting-started/client_apiweekly0.5https://centrifugal.dev/docs/4/getting-started/communityweekly0.5https://centrifugal.dev/docs/4/getting-started/designweekly0.5https://centrifugal.dev/docs/4/getting-started/ecosystemweekly0.5https://centrifugal.dev/docs/4/getting-started/highlightsweekly0.5https://centrifugal.dev/docs/4/getting-started/installationweekly0.5https://centrifugal.dev/docs/4/getting-started/integrationweekly0.5https://centrifugal.dev/docs/4/getting-started/introductionweekly0.5https://centrifugal.dev/docs/4/getting-started/migration_v4weekly0.5https://centrifugal.dev/docs/4/getting-started/quickstartweekly0.5https://centrifugal.dev/docs/4/pro/analyticsweekly0.5https://centrifugal.dev/docs/4/pro/capabilitiesweekly0.5https://centrifugal.dev/docs/4/pro/cel_expressionsweekly0.5https://centrifugal.dev/docs/4/pro/channel_patternsweekly0.5https://centrifugal.dev/docs/4/pro/client_message_batchingweekly0.5https://centrifugal.dev/docs/4/pro/connectionsweekly0.5https://centrifugal.dev/docs/4/pro/install_and_runweekly0.5https://centrifugal.dev/docs/4/pro/overviewweekly0.5https://centrifugal.dev/docs/4/pro/performanceweekly0.5https://centrifugal.dev/docs/4/pro/process_statsweekly0.5https://centrifugal.dev/docs/4/pro/push_notificationsweekly0.5https://centrifugal.dev/docs/4/pro/singleflightweekly0.5https://centrifugal.dev/docs/4/pro/throttlingweekly0.5https://centrifugal.dev/docs/4/pro/token_revocationweekly0.5https://centrifugal.dev/docs/4/pro/tracingweekly0.5https://centrifugal.dev/docs/4/pro/user_blockweekly0.5https://centrifugal.dev/docs/4/pro/user_statusweekly0.5https://centrifugal.dev/docs/4/server/admin_webweekly0.5https://centrifugal.dev/docs/4/server/authenticationweekly0.5https://centrifugal.dev/docs/4/server/channel_permissionsweekly0.5https://centrifugal.dev/docs/4/server/channel_token_authweekly0.5https://centrifugal.dev/docs/4/server/channelsweekly0.5https://centrifugal.dev/docs/4/server/codesweekly0.5https://centrifugal.dev/docs/4/server/configurationweekly0.5https://centrifugal.dev/docs/4/server/console_commandsweekly0.5https://centrifugal.dev/docs/4/server/enginesweekly0.5https://centrifugal.dev/docs/4/server/history_and_recoveryweekly0.5https://centrifugal.dev/docs/4/server/infra_tuningweekly0.5https://centrifugal.dev/docs/4/server/load_balancingweekly0.5https://centrifugal.dev/docs/4/server/monitoringweekly0.5https://centrifugal.dev/docs/4/server/presenceweekly0.5https://centrifugal.dev/docs/4/server/proxyweekly0.5https://centrifugal.dev/docs/4/server/server_apiweekly0.5https://centrifugal.dev/docs/4/server/server_subsweekly0.5https://centrifugal.dev/docs/4/server/tlsweekly0.5https://centrifugal.dev/docs/4/transports/client_apiweekly0.5https://centrifugal.dev/docs/4/transports/client_protocolweekly0.5https://centrifugal.dev/docs/4/transports/client_sdkweekly0.5https://centrifugal.dev/docs/4/transports/http_streamweekly0.5https://centrifugal.dev/docs/4/transports/overviewweekly0.5https://centrifugal.dev/docs/4/transports/sockjsweekly0.5https://centrifugal.dev/docs/4/transports/sseweekly0.5https://centrifugal.dev/docs/4/transports/uni_grpcweekly0.5https://centrifugal.dev/docs/4/transports/uni_http_streamweekly0.5https://centrifugal.dev/docs/4/transports/uni_sseweekly0.5https://centrifugal.dev/docs/4/transports/uni_websocketweekly0.5https://centrifugal.dev/docs/4/transports/websocketweekly0.5https://centrifugal.dev/docs/4/transports/webtransportweekly0.5https://centrifugal.dev/docs/attributionsweekly0.5https://centrifugal.dev/docs/faqweekly0.5https://centrifugal.dev/docs/flow_diagramsweekly0.5https://centrifugal.dev/docs/getting-started/communityweekly0.5https://centrifugal.dev/docs/getting-started/comparisonsweekly0.5https://centrifugal.dev/docs/getting-started/designweekly0.5https://centrifugal.dev/docs/getting-started/ecosystemweekly0.5https://centrifugal.dev/docs/getting-started/highlightsweekly0.5https://centrifugal.dev/docs/getting-started/installationweekly0.5https://centrifugal.dev/docs/getting-started/integrationweekly0.5https://centrifugal.dev/docs/getting-started/introductionweekly0.5https://centrifugal.dev/docs/getting-started/migration_v4weekly0.5https://centrifugal.dev/docs/getting-started/migration_v5weekly0.5https://centrifugal.dev/docs/getting-started/quickstartweekly0.5https://centrifugal.dev/docs/pro/admin_idp_authweekly0.5https://centrifugal.dev/docs/pro/analyticsweekly0.5https://centrifugal.dev/docs/pro/capabilitiesweekly0.5https://centrifugal.dev/docs/pro/cel_expressionsweekly0.5https://centrifugal.dev/docs/pro/channel_patternsweekly0.5https://centrifugal.dev/docs/pro/channel_state_eventsweekly0.5https://centrifugal.dev/docs/pro/client_message_batchingweekly0.5https://centrifugal.dev/docs/pro/connectionsweekly0.5https://centrifugal.dev/docs/pro/distributed_rate_limitweekly0.5https://centrifugal.dev/docs/pro/install_and_runweekly0.5https://centrifugal.dev/docs/pro/observability_enhancementsweekly0.5https://centrifugal.dev/docs/pro/overviewweekly0.5https://centrifugal.dev/docs/pro/performanceweekly0.5https://centrifugal.dev/docs/pro/process_statsweekly0.5https://centrifugal.dev/docs/pro/push_notificationsweekly0.5https://centrifugal.dev/docs/pro/rate_limitingweekly0.5https://centrifugal.dev/docs/pro/singleflightweekly0.5https://centrifugal.dev/docs/pro/token_revocationweekly0.5https://centrifugal.dev/docs/pro/tracingweekly0.5https://centrifugal.dev/docs/pro/user_blockweekly0.5https://centrifugal.dev/docs/pro/user_statusweekly0.5https://centrifugal.dev/docs/server/admin_webweekly0.5https://centrifugal.dev/docs/server/authenticationweekly0.5https://centrifugal.dev/docs/server/channel_permissionsweekly0.5https://centrifugal.dev/docs/server/channel_token_authweekly0.5https://centrifugal.dev/docs/server/channelsweekly0.5https://centrifugal.dev/docs/server/codesweekly0.5https://centrifugal.dev/docs/server/configurationweekly0.5https://centrifugal.dev/docs/server/console_commandsweekly0.5https://centrifugal.dev/docs/server/consumersweekly0.5https://centrifugal.dev/docs/server/enginesweekly0.5https://centrifugal.dev/docs/server/history_and_recoveryweekly0.5https://centrifugal.dev/docs/server/infra_tuningweekly0.5https://centrifugal.dev/docs/server/load_balancingweekly0.5https://centrifugal.dev/docs/server/monitoringweekly0.5https://centrifugal.dev/docs/server/observabilityweekly0.5https://centrifugal.dev/docs/server/presenceweekly0.5https://centrifugal.dev/docs/server/proxyweekly0.5https://centrifugal.dev/docs/server/proxy_streamsweekly0.5https://centrifugal.dev/docs/server/server_apiweekly0.5https://centrifugal.dev/docs/server/server_subsweekly0.5https://centrifugal.dev/docs/server/tlsweekly0.5https://centrifugal.dev/docs/transports/client_apiweekly0.5https://centrifugal.dev/docs/transports/client_protocolweekly0.5https://centrifugal.dev/docs/transports/client_sdkweekly0.5https://centrifugal.dev/docs/transports/http_streamweekly0.5https://centrifugal.dev/docs/transports/overviewweekly0.5https://centrifugal.dev/docs/transports/sockjsweekly0.5https://centrifugal.dev/docs/transports/sseweekly0.5https://centrifugal.dev/docs/transports/uni_client_protocolweekly0.5https://centrifugal.dev/docs/transports/uni_grpcweekly0.5https://centrifugal.dev/docs/transports/uni_http_streamweekly0.5https://centrifugal.dev/docs/transports/uni_sseweekly0.5https://centrifugal.dev/docs/transports/uni_websocketweekly0.5https://centrifugal.dev/docs/transports/websocketweekly0.5https://centrifugal.dev/docs/transports/webtransportweekly0.5https://centrifugal.dev/docs/tutorial/backendweekly0.5https://centrifugal.dev/docs/tutorial/centrifugoweekly0.5https://centrifugal.dev/docs/tutorial/frontendweekly0.5https://centrifugal.dev/docs/tutorial/improvementsweekly0.5https://centrifugal.dev/docs/tutorial/introweekly0.5https://centrifugal.dev/docs/tutorial/layoutweekly0.5https://centrifugal.dev/docs/tutorial/outbox_cdcweekly0.5https://centrifugal.dev/docs/tutorial/outroweekly0.5https://centrifugal.dev/docs/tutorial/recoveryweekly0.5https://centrifugal.dev/docs/tutorial/reverse_proxyweekly0.5https://centrifugal.dev/docs/tutorial/scaleweekly0.5https://centrifugal.dev/docs/tutorial/tips_and_tricksweekly0.5https://centrifugal.dev/weekly0.5 \ No newline at end of file +https://centrifugal.dev/blogweekly0.5https://centrifugal.dev/blog/2020/02/10/million-connections-with-centrifugoweekly0.5https://centrifugal.dev/blog/2020/10/16/experimenting-with-quic-transportweekly0.5https://centrifugal.dev/blog/2020/11/12/scaling-websocketweekly0.5https://centrifugal.dev/blog/2021/01/15/centrifuge-introweekly0.5https://centrifugal.dev/blog/2021/08/31/hello-centrifugo-v3weekly0.5https://centrifugal.dev/blog/2021/10/18/integrating-with-nodejsweekly0.5https://centrifugal.dev/blog/2021/11/04/integrating-with-django-building-chat-applicationweekly0.5https://centrifugal.dev/blog/2021/12/14/laravel-multi-room-chat-tutorialweekly0.5https://centrifugal.dev/blog/2022/07/19/centrifugo-v4-releasedweekly0.5https://centrifugal.dev/blog/2022/07/29/101-way-to-subscribeweekly0.5https://centrifugal.dev/blog/2022/12/20/improving-redis-engine-performanceweekly0.5https://centrifugal.dev/blog/2023/03/31/keycloak-sso-centrifugoweekly0.5https://centrifugal.dev/blog/2023/06/29/centrifugo-v5-releasedweekly0.5https://centrifugal.dev/blog/2023/08/19/asynchronous-message-streaming-to-centrifugo-with-benthosweekly0.5https://centrifugal.dev/blog/2023/08/29/using-centrifugo-in-rabbitxweekly0.5https://centrifugal.dev/blog/2023/10/29/discovering-centrifugo-pro-push-notificationsweekly0.5https://centrifugal.dev/blog/2024/03/18/stream-loki-logs-to-browser-with-websocket-to-grpc-subscriptionsweekly0.5https://centrifugal.dev/blog/archiveweekly0.5https://centrifugal.dev/blog/tagsweekly0.5https://centrifugal.dev/blog/tags/authenticationweekly0.5https://centrifugal.dev/blog/tags/benthosweekly0.5https://centrifugal.dev/blog/tags/centrifugeweekly0.5https://centrifugal.dev/blog/tags/centrifugoweekly0.5https://centrifugal.dev/blog/tags/djangoweekly0.5https://centrifugal.dev/blog/tags/goweekly0.5https://centrifugal.dev/blog/tags/grpcweekly0.5https://centrifugal.dev/blog/tags/interviewweekly0.5https://centrifugal.dev/blog/tags/keycloakweekly0.5https://centrifugal.dev/blog/tags/laravelweekly0.5https://centrifugal.dev/blog/tags/lokiweekly0.5https://centrifugal.dev/blog/tags/phpweekly0.5https://centrifugal.dev/blog/tags/proweekly0.5https://centrifugal.dev/blog/tags/proxyweekly0.5https://centrifugal.dev/blog/tags/push-notificationsweekly0.5https://centrifugal.dev/blog/tags/quicweekly0.5https://centrifugal.dev/blog/tags/redisweekly0.5https://centrifugal.dev/blog/tags/releaseweekly0.5https://centrifugal.dev/blog/tags/ssoweekly0.5https://centrifugal.dev/blog/tags/tutorialweekly0.5https://centrifugal.dev/blog/tags/usecaseweekly0.5https://centrifugal.dev/blog/tags/websocketweekly0.5https://centrifugal.dev/blog/tags/webtransportweekly0.5https://centrifugal.dev/components/Highlightweekly0.5https://centrifugal.dev/components/logoweekly0.5https://centrifugal.dev/components/logos/Badooweekly0.5https://centrifugal.dev/components/logos/Grafanaweekly0.5https://centrifugal.dev/components/logos/ManyChatweekly0.5https://centrifugal.dev/components/logos/OpenWebweekly0.5https://centrifugal.dev/licenseweekly0.5https://centrifugal.dev/searchweekly0.5https://centrifugal.dev/docs/3/attributionsweekly0.5https://centrifugal.dev/docs/3/ecosystem/centrifugeweekly0.5https://centrifugal.dev/docs/3/ecosystem/integrationsweekly0.5https://centrifugal.dev/docs/3/faqweekly0.5https://centrifugal.dev/docs/3/flow_diagramsweekly0.5https://centrifugal.dev/docs/3/getting-started/client_apiweekly0.5https://centrifugal.dev/docs/3/getting-started/designweekly0.5https://centrifugal.dev/docs/3/getting-started/highlightsweekly0.5https://centrifugal.dev/docs/3/getting-started/installationweekly0.5https://centrifugal.dev/docs/3/getting-started/integrationweekly0.5https://centrifugal.dev/docs/3/getting-started/introductionweekly0.5https://centrifugal.dev/docs/3/getting-started/migration_v3weekly0.5https://centrifugal.dev/docs/3/getting-started/quickstartweekly0.5https://centrifugal.dev/docs/3/pro/analyticsweekly0.5https://centrifugal.dev/docs/3/pro/db_namespacesweekly0.5https://centrifugal.dev/docs/3/pro/install_and_runweekly0.5https://centrifugal.dev/docs/3/pro/overviewweekly0.5https://centrifugal.dev/docs/3/pro/performanceweekly0.5https://centrifugal.dev/docs/3/pro/process_statsweekly0.5https://centrifugal.dev/docs/3/pro/singleflightweekly0.5https://centrifugal.dev/docs/3/pro/throttlingweekly0.5https://centrifugal.dev/docs/3/pro/token_revocationweekly0.5https://centrifugal.dev/docs/3/pro/tracingweekly0.5https://centrifugal.dev/docs/3/pro/user_blockweekly0.5https://centrifugal.dev/docs/3/pro/user_connectionsweekly0.5https://centrifugal.dev/docs/3/pro/user_statusweekly0.5https://centrifugal.dev/docs/3/server/admin_webweekly0.5https://centrifugal.dev/docs/3/server/authenticationweekly0.5https://centrifugal.dev/docs/3/server/channelsweekly0.5https://centrifugal.dev/docs/3/server/codesweekly0.5https://centrifugal.dev/docs/3/server/configurationweekly0.5https://centrifugal.dev/docs/3/server/console_commandsweekly0.5https://centrifugal.dev/docs/3/server/enginesweekly0.5https://centrifugal.dev/docs/3/server/history_and_recoveryweekly0.5https://centrifugal.dev/docs/3/server/infra_tuningweekly0.5https://centrifugal.dev/docs/3/server/load_balancingweekly0.5https://centrifugal.dev/docs/3/server/monitoringweekly0.5https://centrifugal.dev/docs/3/server/private_channelsweekly0.5https://centrifugal.dev/docs/3/server/proxyweekly0.5https://centrifugal.dev/docs/3/server/server_apiweekly0.5https://centrifugal.dev/docs/3/server/server_subsweekly0.5https://centrifugal.dev/docs/3/server/tlsweekly0.5https://centrifugal.dev/docs/3/transports/client_protocolweekly0.5https://centrifugal.dev/docs/3/transports/client_sdkweekly0.5https://centrifugal.dev/docs/3/transports/overviewweekly0.5https://centrifugal.dev/docs/3/transports/sockjsweekly0.5https://centrifugal.dev/docs/3/transports/uni_grpcweekly0.5https://centrifugal.dev/docs/3/transports/uni_http_streamweekly0.5https://centrifugal.dev/docs/3/transports/uni_sseweekly0.5https://centrifugal.dev/docs/3/transports/uni_websocketweekly0.5https://centrifugal.dev/docs/3/transports/websocketweekly0.5https://centrifugal.dev/docs/4/attributionsweekly0.5https://centrifugal.dev/docs/4/faqweekly0.5https://centrifugal.dev/docs/4/flow_diagramsweekly0.5https://centrifugal.dev/docs/4/getting-started/client_apiweekly0.5https://centrifugal.dev/docs/4/getting-started/communityweekly0.5https://centrifugal.dev/docs/4/getting-started/designweekly0.5https://centrifugal.dev/docs/4/getting-started/ecosystemweekly0.5https://centrifugal.dev/docs/4/getting-started/highlightsweekly0.5https://centrifugal.dev/docs/4/getting-started/installationweekly0.5https://centrifugal.dev/docs/4/getting-started/integrationweekly0.5https://centrifugal.dev/docs/4/getting-started/introductionweekly0.5https://centrifugal.dev/docs/4/getting-started/migration_v4weekly0.5https://centrifugal.dev/docs/4/getting-started/quickstartweekly0.5https://centrifugal.dev/docs/4/pro/analyticsweekly0.5https://centrifugal.dev/docs/4/pro/capabilitiesweekly0.5https://centrifugal.dev/docs/4/pro/cel_expressionsweekly0.5https://centrifugal.dev/docs/4/pro/channel_patternsweekly0.5https://centrifugal.dev/docs/4/pro/client_message_batchingweekly0.5https://centrifugal.dev/docs/4/pro/connectionsweekly0.5https://centrifugal.dev/docs/4/pro/install_and_runweekly0.5https://centrifugal.dev/docs/4/pro/overviewweekly0.5https://centrifugal.dev/docs/4/pro/performanceweekly0.5https://centrifugal.dev/docs/4/pro/process_statsweekly0.5https://centrifugal.dev/docs/4/pro/push_notificationsweekly0.5https://centrifugal.dev/docs/4/pro/singleflightweekly0.5https://centrifugal.dev/docs/4/pro/throttlingweekly0.5https://centrifugal.dev/docs/4/pro/token_revocationweekly0.5https://centrifugal.dev/docs/4/pro/tracingweekly0.5https://centrifugal.dev/docs/4/pro/user_blockweekly0.5https://centrifugal.dev/docs/4/pro/user_statusweekly0.5https://centrifugal.dev/docs/4/server/admin_webweekly0.5https://centrifugal.dev/docs/4/server/authenticationweekly0.5https://centrifugal.dev/docs/4/server/channel_permissionsweekly0.5https://centrifugal.dev/docs/4/server/channel_token_authweekly0.5https://centrifugal.dev/docs/4/server/channelsweekly0.5https://centrifugal.dev/docs/4/server/codesweekly0.5https://centrifugal.dev/docs/4/server/configurationweekly0.5https://centrifugal.dev/docs/4/server/console_commandsweekly0.5https://centrifugal.dev/docs/4/server/enginesweekly0.5https://centrifugal.dev/docs/4/server/history_and_recoveryweekly0.5https://centrifugal.dev/docs/4/server/infra_tuningweekly0.5https://centrifugal.dev/docs/4/server/load_balancingweekly0.5https://centrifugal.dev/docs/4/server/monitoringweekly0.5https://centrifugal.dev/docs/4/server/presenceweekly0.5https://centrifugal.dev/docs/4/server/proxyweekly0.5https://centrifugal.dev/docs/4/server/server_apiweekly0.5https://centrifugal.dev/docs/4/server/server_subsweekly0.5https://centrifugal.dev/docs/4/server/tlsweekly0.5https://centrifugal.dev/docs/4/transports/client_apiweekly0.5https://centrifugal.dev/docs/4/transports/client_protocolweekly0.5https://centrifugal.dev/docs/4/transports/client_sdkweekly0.5https://centrifugal.dev/docs/4/transports/http_streamweekly0.5https://centrifugal.dev/docs/4/transports/overviewweekly0.5https://centrifugal.dev/docs/4/transports/sockjsweekly0.5https://centrifugal.dev/docs/4/transports/sseweekly0.5https://centrifugal.dev/docs/4/transports/uni_grpcweekly0.5https://centrifugal.dev/docs/4/transports/uni_http_streamweekly0.5https://centrifugal.dev/docs/4/transports/uni_sseweekly0.5https://centrifugal.dev/docs/4/transports/uni_websocketweekly0.5https://centrifugal.dev/docs/4/transports/websocketweekly0.5https://centrifugal.dev/docs/4/transports/webtransportweekly0.5https://centrifugal.dev/docs/attributionsweekly0.5https://centrifugal.dev/docs/faqweekly0.5https://centrifugal.dev/docs/flow_diagramsweekly0.5https://centrifugal.dev/docs/getting-started/communityweekly0.5https://centrifugal.dev/docs/getting-started/comparisonsweekly0.5https://centrifugal.dev/docs/getting-started/designweekly0.5https://centrifugal.dev/docs/getting-started/ecosystemweekly0.5https://centrifugal.dev/docs/getting-started/highlightsweekly0.5https://centrifugal.dev/docs/getting-started/installationweekly0.5https://centrifugal.dev/docs/getting-started/integrationweekly0.5https://centrifugal.dev/docs/getting-started/introductionweekly0.5https://centrifugal.dev/docs/getting-started/migration_v4weekly0.5https://centrifugal.dev/docs/getting-started/migration_v5weekly0.5https://centrifugal.dev/docs/getting-started/quickstartweekly0.5https://centrifugal.dev/docs/pro/admin_idp_authweekly0.5https://centrifugal.dev/docs/pro/analyticsweekly0.5https://centrifugal.dev/docs/pro/capabilitiesweekly0.5https://centrifugal.dev/docs/pro/cel_expressionsweekly0.5https://centrifugal.dev/docs/pro/channel_patternsweekly0.5https://centrifugal.dev/docs/pro/channel_state_eventsweekly0.5https://centrifugal.dev/docs/pro/client_message_batchingweekly0.5https://centrifugal.dev/docs/pro/connectionsweekly0.5https://centrifugal.dev/docs/pro/distributed_rate_limitweekly0.5https://centrifugal.dev/docs/pro/install_and_runweekly0.5https://centrifugal.dev/docs/pro/observability_enhancementsweekly0.5https://centrifugal.dev/docs/pro/overviewweekly0.5https://centrifugal.dev/docs/pro/performanceweekly0.5https://centrifugal.dev/docs/pro/process_statsweekly0.5https://centrifugal.dev/docs/pro/push_notificationsweekly0.5https://centrifugal.dev/docs/pro/rate_limitingweekly0.5https://centrifugal.dev/docs/pro/singleflightweekly0.5https://centrifugal.dev/docs/pro/token_revocationweekly0.5https://centrifugal.dev/docs/pro/tracingweekly0.5https://centrifugal.dev/docs/pro/user_blockweekly0.5https://centrifugal.dev/docs/pro/user_statusweekly0.5https://centrifugal.dev/docs/server/admin_webweekly0.5https://centrifugal.dev/docs/server/authenticationweekly0.5https://centrifugal.dev/docs/server/channel_permissionsweekly0.5https://centrifugal.dev/docs/server/channel_token_authweekly0.5https://centrifugal.dev/docs/server/channelsweekly0.5https://centrifugal.dev/docs/server/codesweekly0.5https://centrifugal.dev/docs/server/configurationweekly0.5https://centrifugal.dev/docs/server/console_commandsweekly0.5https://centrifugal.dev/docs/server/consumersweekly0.5https://centrifugal.dev/docs/server/enginesweekly0.5https://centrifugal.dev/docs/server/history_and_recoveryweekly0.5https://centrifugal.dev/docs/server/infra_tuningweekly0.5https://centrifugal.dev/docs/server/load_balancingweekly0.5https://centrifugal.dev/docs/server/monitoringweekly0.5https://centrifugal.dev/docs/server/observabilityweekly0.5https://centrifugal.dev/docs/server/presenceweekly0.5https://centrifugal.dev/docs/server/proxyweekly0.5https://centrifugal.dev/docs/server/proxy_streamsweekly0.5https://centrifugal.dev/docs/server/server_apiweekly0.5https://centrifugal.dev/docs/server/server_subsweekly0.5https://centrifugal.dev/docs/server/tlsweekly0.5https://centrifugal.dev/docs/transports/client_apiweekly0.5https://centrifugal.dev/docs/transports/client_protocolweekly0.5https://centrifugal.dev/docs/transports/client_sdkweekly0.5https://centrifugal.dev/docs/transports/http_streamweekly0.5https://centrifugal.dev/docs/transports/overviewweekly0.5https://centrifugal.dev/docs/transports/sockjsweekly0.5https://centrifugal.dev/docs/transports/sseweekly0.5https://centrifugal.dev/docs/transports/uni_client_protocolweekly0.5https://centrifugal.dev/docs/transports/uni_grpcweekly0.5https://centrifugal.dev/docs/transports/uni_http_streamweekly0.5https://centrifugal.dev/docs/transports/uni_sseweekly0.5https://centrifugal.dev/docs/transports/uni_websocketweekly0.5https://centrifugal.dev/docs/transports/websocketweekly0.5https://centrifugal.dev/docs/transports/webtransportweekly0.5https://centrifugal.dev/docs/tutorial/backendweekly0.5https://centrifugal.dev/docs/tutorial/centrifugoweekly0.5https://centrifugal.dev/docs/tutorial/frontendweekly0.5https://centrifugal.dev/docs/tutorial/improvementsweekly0.5https://centrifugal.dev/docs/tutorial/introweekly0.5https://centrifugal.dev/docs/tutorial/layoutweekly0.5https://centrifugal.dev/docs/tutorial/outbox_cdcweekly0.5https://centrifugal.dev/docs/tutorial/outroweekly0.5https://centrifugal.dev/docs/tutorial/recoveryweekly0.5https://centrifugal.dev/docs/tutorial/reverse_proxyweekly0.5https://centrifugal.dev/docs/tutorial/scaleweekly0.5https://centrifugal.dev/docs/tutorial/tips_and_tricksweekly0.5https://centrifugal.dev/weekly0.5 \ No newline at end of file