flipt-io / flipt

Enterprise-ready, GitOps enabled, CloudNative feature management solution
https://flipt.io
GNU General Public License v3.0
3.81k stars 216 forks source link

A way to send push notifications to update client-side cache when a flag changes in the backend. #3458

Open umarlateef opened 2 months ago

umarlateef commented 2 months ago

Problem

There is a possibility that users may set the cache refresh interval too low, which could lead to undesired traffic and load on the server. This can be inefficient and unnecessary, as it increases server load even when no changes have been made. A more efficient approach would be to notify clients when a change in their feature toggle occurs, allowing them to refresh the local cache only when necessary.

Ideal Solution

Implement a system that sends a push notification to clients when there is a change in their feature toggle. Upon receiving this notification, the clients can refresh their local cache accordingly. This approach would reduce server traffic and ensure that the cache is updated only when needed, improving overall performance.

Search

Additional Context

No response

markphelps commented 1 month ago

Good idea @umarlateef !

We could implement Server Sent Events (SSE) in Flipt server and expose an endpoint where our client side SDKs can subscribe to these events.

Here's how I'm thinking this could work:

  1. Add a new endpoint like get: /internal/v1/evaluation/snapshot/namespace/{key}/subscribe that allows clients to maintain a sse connection
  2. Make use of our namespace versioned stores that keep track of when anything in a namespace is changed
  3. Push events (the etag or version) to subscribed clients over SSE
  4. Our client SDKs can then refetch the flag state from Flipt server whenever this version changes by fetching with the etag/version they receive over SSE
umarlateef commented 1 month ago

@markphelps That will solve the problem, and help us reduce the load on the server.

markphelps commented 1 week ago

@umarlateef 👋🏻

This may not be what you're looking for as its not in open source Flipt yet.. but we did just release streaming support to our client side SDKs for Flipt Cloud. https://docs.flipt.io/integration/client#polling-vs-streaming