Sure!
This doesn't seem like a terribly scary amount of volume (even the 30GB of data), but I'll let others chime in as well.
With it being a net-new job, bootstrapping the state does make sense to ensure that on your first run, you'll have everything that you need. You could introduce a separate stream of data to support the update use-case as well similar to the example that
@Andreas Bube provided (connect your update stream responsible for updating the values in state with the operator responsible for enrichment).
> Frequency of updates: maybe
100-1000 records a day, mostly upserts. ... mostly value would change
This is pretty common. I'd say the biggest complication would be getting all 30GB of your records into a state that's consumable for your bootstrap process (e.g., if it's in a database consider leveraging a CDC connector to bring it into a Kafka topic via a snapshot). This same CDC connector would be used within your job to listen to updates and update state accordingly.
I know I've bootstrapped jobs with ~100M+ records and it worked like a charm.
> Also this could be starting point and lookup data may even go upto 3x in a year. How can we make this system scalable. 100msg/sec is nothing for kafka or flink butlookup seems challenge to me.
So keep in mind, if you are storing the lookup data in Flink state, the lookup is going to be trivial. Think of it closer to an "in memory" lookup from a hashmap or cache (in this case backed by RocksDB, so "technically" disk). You aren't going to be issuing external calls to your database for each record, which is typically where people will be a bit more fearful in terms of increasing volumes.
Depending on your deployment model -- you can configure things like autoscaling as well. Assuming your job is designed in a matter that doesn't prohibit parallelization (e.g., keying by low cardinality keys), scaling out should not be a problem.
> So, loading into RAM vs using some cache system vs distributing it across multiple nodes!!
Yup this is what Flink excels at. While having adequate RAM
is important, RocksDB is going to typically be how your state is backed (disk instead of RAM). It's highly scalable, configurable and ... far less expensive than say a proper distributed cache like Redis, etc. All of your state isn't going to be loaded into memory at any given time.