Batch vs. Stream Processing: When to Use Spark, Flink, or Kafka Streams