本章介绍了关于流式计算的一些背景,描述了什么是samza,以及samza为什么会被构建出来。
消息系统是实现近实时的异步计算的流行方式。当有消息产生时可以被放入一个消息队列(ActiveMQ,RabbitMQ)、发布-订阅系统(Kestrel,Kafka)或者日志聚合系统(Flume、Scribe)。下游消费者从这些系统中读取信息,并对其进行处理,或基于该消息的内容执行下一步操作。
假设你有一个网站,每次有人加载一个页面,你发送一个“用户浏览的网页”事件消息系统。那么你可能会有消费者对其做以下的操作:
总的来说,消息系统能解耦所有这些来自实际网页服务的工作。
一个信息系统是一个相当低层次的基础设施–其存储消息并等待消费者去消费信息。当你开始编写代码去产生或消费消息时,你很快就会发现,有很多棘手的问题,必须在处理层解决。samza旨在帮助解决这些问题。
在我们上面提到的消费者操作实例(计算PV以及更新仪表板)中:
如果你的消费者挂掉,而且你的计算数值丢失时会发生什么?
你又要如何去恢复?
当服务重启之后又该从哪里开始处理?
如果底层的消息系统重复发送了一条信息或者丢失了一条消息又该怎么办?(如果你的处理不够细致,那么你的计数会是错误的)
如果你想根据用户访问的网页URL进行分组统计呢?
当一台服务器访问量过大时,你如何将数据分流到多台机器上进行分布式计算?
流处理是在消息系统中的一个高层次的抽象,它所要解决的正是以上提到的这类问题。
samza是流处理框架具有以下特点:
目前可用的开源流处理系统实际上是相当年轻,没有一个系统提供了完整的解决方案。
在这方面的新问题:如何一个流处理器的状态进行管理,是否流应该缓冲远程磁盘上,当重复接收信息或信息丢失时应该怎么做,以及如何模型底层消息传递系统。
Samza与现有开源流处理系统主要区别:
samza上更深入的讨论,以及它如何与其他数据流处理系统的比较,请看samza的概述文档。