在比较两个流式处理系统时,要着重考虑使用场景是什么。以下是一些需要考虑的应用类别。
摄取
摄取的目的是将数据从一个系统移动到另一个系统,并在传输过程中对数据进行一些修改,使其更适用于目标系统。
低延迟
任何要求立即得到响应的应用。有些欺诈检测场景就属于这一类。
异步微服务
这些微服务为大型的业务流程执行一些简单操作,比如更新仓储信息。这些应用需要通过维护本地状态缓存来提升性能。
几近实时的数据分析
这些流式媒体应用程序执行复杂的聚合和连接,以便对数据进行切分,并生成有趣的业务见解。
选择何种流式处理系统取决于要解决什么问题。
- 如果要解决摄取问题,那么需要考虑一下是需要一个流式处理系统还是一个更简单的专注于摄取的系统,比如 Kafka Connect。如果确定需要一个流式处理系统,那就要确保它拥有可用的连接器,并且要保证目标系统也有高质量的连接器可用。
- 如果要解决的问题要求毫秒级的延迟,那么就要考虑一下是否一定要用流。一般来说,请求与响应模式更加适用于这种任务。如果确定需要一个流式处理系统,那就需要选择一个支持低延迟的模型,而不是基于微批次的模型。
- 如果要构建异步微服务,那么需要一个可以很好地与消息总线(希望是 Kafka)集成的流式处理系统。它应该具备变更捕捉能力,这样就可以将上游的变更传递到微服务本地的缓存里,而且它要支持本地存储,可以作为微服务数据的缓存和物化视图。
- 如果要构建复杂的数据分析引擎,那么也需要一个支持本地存储的流式处理系统,不过这次不是为了本地缓存和物化视图,而是为了支持高级的聚合、时间窗口和连接,因为如果没有本地存储,就很难实现这些特性。API 需要支持自定义聚合、基于时间窗口的操作和多类型连接。
除了使用场景外,还有如下一些全局的考虑点。
系统的可操作性
它是否容易部署?是否容易监控和调试?是否易于伸缩?它是否能够很好地与已有的基础设施集成起来?如果出现错误,需要重新处理数据,这个时候该怎么办?
API 的可用性和调试的简单性
为了开发出高质量的应用,同一种框架的不同版本可能需要耗费不同的时间,这类情况很常见。开发时间和上市时机太重要了,所以我们需要选择一个高效率的系统。
让复杂的事情简单化
几乎每一个系统都声称它们支持基于时间窗口的高级聚合操作和本地缓存,但问题是,它们够简单吗?它们是处理了规模伸缩和故障恢复方面的细节问题,还是只提供了脆弱的抽象,然后让你来处理剩下的事情?系统提供的 API 越简洁,封装的细节越多,开发人员的效率就越高。