KAFKA??????
?????? 使用kafa作為ETL數據通道,通過kafka配套的connect和schemaRegisty來方便快速實現異構數據源的相互轉換和存儲,通過connect插件生產和消費數據,通過schemaRegisty轉換異構數據(可以在幾乎所有你知道的數據源之間相互轉換),并且數據可以重復被消費(可以通過配置指定數據存儲時長)。kafka的開發團隊圍繞著kafka開發了一整套自成體系的生態圈(confluent platform)。
???????????????????? Building a Scalable ETL Pipeline with Kafka Connect In 30 Minutes
優點:
可擴展。Kafka集群可以透明的擴展,增加新的服務器進集群。
高性能。Kafka性能遠超過傳統的ActiveMQ、RabbitMQ等,Kafka支持Batch操作。
容錯性。Kafka每個Partition數據會復制到幾臺服務器,當某個Broker失效時,Zookeeper將通知生產者和消費者從而使用其他的Broker。
缺點:
重復消息。Kafka保證每條消息至少送達一次,雖然幾率很小,但一條消息可能被送達多次。
消息亂序。Kafka某一個固定的Partition內部的消息是保證有序的,如果一個Topic有多個Partition,partition之間的消息送達不保證有序。
復雜性。Kafka需要Zookeeper的支持,Topic一般需要人工創建,部署和維護比一般MQ成本更高。
MQ
消息隊列中間件還有很多種,列舉幾個:
RocketMq,是阿里在充分reviewkafka代碼后,開發的metaQ。在不斷更新,修補以后,阿里把metaQ3.0更名為rocket,并且rocket是java寫的易于維護。
RabbitMQ,支持對消息的可靠的傳遞,支持事務,不支持批量的操作;基于存儲的可靠性的要求存儲可以采用內存或者硬盤。
REDIS
?????? Redis 的有序集合用來做隊列還是不錯的,用來實現做簡單的任務隊列,性能不錯,也有持久化(rdb/aof) 但是發布、消費等的確認需要自己實現,所以redis得使用還是建議把它當內存數據庫來吧。
Kafka
kafka是個日志處理緩沖組件,主要在大數據信息處理中使用。和傳統的消息隊列相比簡化了隊列結構和功能,以文件流形式處理存儲(持久化)消息(主要是日志)。
日志信息通常數據量巨大,處理組件一般會處理不過來,所以有了緩沖層kafka。kafka支持巨大的日志吞吐量。為了防止數據丟失,其消息被消費后不會直接丟棄,要多存儲一段時間,等超過設置的時間閾值才會丟棄。這是mq和redis所不具備的。
主要特點如下:
巨型存儲量: 支持TB甚至PB級別數據。
高吞吐,高IO:一般配置的服務器就可實現單機每秒100K條以上的消息傳輸。
消息分區,分布式消費:能保證消息順序傳輸。 支持離線數據處理(hadoop集群)和實時數據處理。
橫向擴展:支持在線水平擴展,以支持更大數據處理能力。
redis
redis是一個高性能的、原子操作的內存鍵值對nosql。支持高速訪問,可用做消息隊列的存儲,但是不具備消息隊列的任何功能和邏輯,要做為消息隊列來使用的話,隊列功能和邏輯要通過上層應用來自己實現。
MQ,消息隊列
我們以RabbitMQ為例來做介紹。它是用Erlang語言開發的開源消息隊列,支持多種協議包括AMQP,XMPP, SMTP, STOMP,適合于企業級的開發。
MQ支持Broker構架,消息發送給客戶端時需要在中心隊列排隊。對路由,負載均衡或者數據持久化都有很好的支持。
其他更多消息隊列
還有ActiveMq,ZeroMq等,功能上大同小異。
有專門測試的結果表明,并發吞吐TPS比較,ZeroMq 最好,RabbitMq 次之, ActiveMq 最差。