1. 程式人生 > >rabbitmq 和 kafka 簡單的效能測試

rabbitmq 和 kafka 簡單的效能測試

測試環境:ubuntu 15.10 64位

cpu:inter core i7-4790 3.60GHZ * 8

記憶體:16GB

硬碟:ssd 120GB

軟體環境:rabbmitmq 3.6.0   kafka0.8.1  (均為單機本機執行)

 PS: 測試結果均為單操作測試,即生產的時候沒有消費操作

測試結果:

kafka :消費速度: 37,586 /s  生產速度: 448,753 /s

rabbitmq: 消費速度: 20,807 /s  生產速度  16.413 /s

出現問題:

rabbitmq 生產4分鐘左右出現佇列阻塞,無法繼續新增資料,1分鐘後恢復,再過大約1分鐘又出現此現象並以約1分鐘為間隔出現此問題。

rabbitmq 生產物件時有不小的機率(約 1/20)新增佇列失敗,報出的錯誤是“tcp連結重置”

其他並無任何問題

結論:

  很明顯的看出kafka的效能遠超rabbitmq。不過這也是理所當然的,畢竟2個訊息佇列實現的協議是不一樣的,處理訊息的場景也大有不同。rabbitmq適合處理一些資料嚴謹的訊息,比如說支付訊息,社交訊息等不能丟失的資料。kafka是批量操作切不報證資料是否能完整的到達消費者端,所以適合一些大量的營銷訊息的場景。(測試結果均為單操作測試,即生產的時候沒有消費操作~~)

程式碼:

kafka:

複製程式碼
package main
import (
    
"github.com/Shopify/sarama" "os" "os/signal" "sync" "log" "time" ) func main() { go producer() // go consumer() time.Sleep(10*time.Minute) } func producer() { config :=sarama.NewConfig() config.Producer.Return.Successes = true proder,err := sarama.NewAsyncProducer([]string
{"localhost:9092"},config) if err != nil { panic(err) } signals :=make(chan os.Signal,1) signal.Notify(signals,os.Interrupt) var ( wg sync.WaitGroup enqueued, successes, errors int ) wg.Add(1) go func() { defer wg.Done() for _=range proder.Successes(){ successes++ } }() wg.Add(1) go func() { defer wg.Done() for err := range proder.Errors(){ log.Println(err) errors++ } }() go func() { t1 := time.NewTicker(time.Second) for{ <- t1.C log.Println(enqueued) } }() ProducerLoop: for{ message :=&sarama.ProducerMessage{Topic:"test",Value:sarama.StringEncoder("testing 123")} select { case proder.Input() <- message: enqueued++ case <- signals: proder.AsyncClose() break ProducerLoop } } wg.Wait() log.Println("Successfully produced:%d;errors:%d\n",successes,errors) } func consumer() { coner,err := sarama.NewConsumer([]string{"localhost:9092"},nil) if err != nil { panic(err) } defer func() { if err :=coner.Close(); err !=nil{ log.Fatalln(err) } }() partitionConsumer ,err := coner.ConsumePartition("test",0,sarama.OffsetNewest) if err != nil { panic(err) } defer func() { if err := partitionConsumer.Close();err!=nil{ log.Fatalln(err) } }() signals := make(chan os.Signal,1) signal.Notify(signals,os.Interrupt) consumed:=0 go func() { t1 := time.NewTicker(time.Second) for{ <- t1.C log.Println(consumed) } }() ConsumerLoop: for{ select { case _ = <-partitionConsumer.Messages(): consumed++ // log.Println( string(msg.Value)," => ",consumed) case <-signals: break ConsumerLoop } } log.Printf("Consumed: %d\n", consumed) }
複製程式碼

rabbitmq:

複製程式碼
package main

import (
    "github.com/streadway/amqp"
    "time"
    "fmt"
    "log"
)

const (
    queueName = "push.msg.q"
    exchange  = "t.msg.ex"
    mqurl ="amqp://shimeng:[email protected]:5672/push"

)

var conn *amqp.Connection
var channel *amqp.Channel

func main() {
    fmt.Println(1)
//    push()
    receive()
//    fmt.Println("end")
//    close()
}

func failOnErr(err error, msg string) {
    if err != nil {
        log.Fatalf("%s:%s", msg, err)
        panic(fmt.Sprintf("%s:%s", msg, err))
    }
}

func mqConnect() {
    var err error
    conn, err = amqp.Dial(mqurl)
    if err != nil {
        log.Println(1)
        log.Fatalln(err)
    }
    fmt.Println(5)
    channel, err = conn.Channel()
    if err != nil {
        fmt.Println(2)
        log.Fatalln(err)
    }else {
        fmt.Println("a")
    }
}

func push() {
    count := 0
    if channel == nil {
        fmt.Println(2)
        mqConnect()
    }else {
        fmt.Println(3)
    }
    msgContent := "hello world!"
    t1 := time.NewTicker(time.Second)

    go func() {
        for{
            <- t1.C
            log.Println(count)
        }
    }()

    for{
        err := channel.Publish(exchange, "test", false, false, amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte(msgContent),
        })
        if err != nil {

        }else {
            count ++
        }

    }

}

func receive() {
    if channel == nil {
        mqConnect()
    }
    count :=0
    msgs, err := channel.Consume(queueName, "", true, false, false, false, nil)
    failOnErr(err, "")

    forever := make(chan bool)

    t1 := time.NewTicker(time.Second)
    go func() {
        for{
            <- t1.C
            log.Println(count)
        }
    }()
    go func() {
        //fmt.Println(*msgs)
        for _= range msgs {
            count ++
//            s := BytesToString(&(d.Body))
//            count++
//            fmt.Printf("receve msg is :%s -- %d\n", *s, count)
        }
    }()

    fmt.Printf(" [*] Waiting for messages. To exit press CTRL+C\n")
    <-forever
}
複製程式碼

相關推薦

rabbitmq kafka 簡單效能測試

測試環境:ubuntu 15.10 64位 cpu:inter core i7-4790 3.60GHZ * 8 記憶體:16GB 硬碟:ssd 120GB 軟體環境:rabbmitmq 3.6.0   kafka0.8.1  (均為單機本機執行)  PS: 測

RabbitMQKafka從幾個角度簡單的對比

在應用場景方面: RabbitMQ,遵循AMQP協議,由內在高併發的erlanng語言開發,用在實時的對可靠性要求比較高的訊息傳遞上。 kafka是Linkedin於2010年12月份開源的訊息釋出訂閱系統,它主要用於處理活躍的流式資料,大資料量的資料處理上。 1)在架

splFixedArrayPHP array的簡單效能測試對比

自從5.3版本開始,PHP在SPL擴充套件中提供了一個叫做splFixedArray的陣列[連結],splFixedArray陣列相比標準的PHP陣列更接近於C語言的陣列,而且由於splFixedArray沒有使用雜湊(Hash)儲存方式,因此效率更高。下面我們

snaictornado的簡單效能測試

作業系統 : CentOS7.3.1611_x64 Python 版本 : 3.6.8 tornado版本:6.0.2 snaic版本:19.9.0 CPU : Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz 4核 之前一直使用tornado作為http相關pytho

rabbitmqkafka怎麽選?【轉】

流式 src 讀取數據 內部 zero-copy 丟失 簡單 好的 項目 MQ框架非常之多,今天簡單說一下有代表性的兩個MQ(rabbitmq和kafka)。經常會有人問rabbitmq和kafka到底哪個好呢?其實沒有好與不好之分,只有哪個更合適,首先要根據自己項目的業務

RabbitMQkafka的區別

1.應用場景方面 RabbitMQ:用於實時的,對可靠性要求較高的訊息傳遞上。 kafka:用於處於活躍的流式資料,大資料量的資料處理上。 2.架構模型方面 producer,broker,consumer RabbitMQ:以broker為中心,有訊息的確認機制 kafka:以consum

記一次NodeGo的效能測試

以前簡單測過go的效能,高併發場景下確實比node會好一些,一直想找個時間系統性地測一下,手頭正好有一臺前段時間買的遊戲主機,裝了ubuntu就開測了 準備工作 測試機和試壓機系統都是ubuntu 18.04.1 首先安裝node和go,版本分別如下: node 10.13.0

RabbitMQ Kafka 到底怎麼選?

前言 開源社群有好多優秀的佇列中介軟體,比如RabbitMQ和Kafka,每個佇列都貌似有其特性,在進行工程選擇時,往往眼花繚亂,不知所措。對於RabbitMQ和Kafka,到底應該選哪個?   RabbitMQ架構 RabbitMQ是一個分散式系統,這裡面有幾個抽

當你想進行簡單效能測試監控的時候應該如何選擇監控命令?

此文已由作者趙慧莉授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 一、前言 在進行效能測試前,有些引數需要本地進行除錯,不適合直接使用效能測試平臺。主要通過監控CPU、記憶體、磁碟、網路情況來判斷是否符合標準。接下來將通過CPU、記憶體、磁碟、網路情況的評估標準、常見的監控命令、常

timescaledbPG寫入效能測試

目錄   結論摘要 測試環境 資料構造 CASE 1 單TIME索引 單行寫入 WAL檔案增加 BATCH寫入 資源佔用 CASE 2 增加一個索引 單行寫入 BATCH寫入 資源佔用 CASE 3 大量資料 結論摘要 小

RabbitMQKafka到底怎麼選?

前言 開源社群有好多優秀的佇列中介軟體,比如RabbitMQ和Kafka,每個佇列都貌似有其特性,在進行工程選擇時,往往眼花繚亂,不知所措。對於RabbitMQ和Kafka,到底應該選哪個? RabbitMQ架構 RabbitMQ是一個分散式系統,這裡面有幾個抽象概念。 broker:每個節點執行的服務程式

RabbitMQKafka到底怎麼選(二)?

前言 前一篇文章《RabbitMQ和Kafka到底怎麼選?》,我們在吞吐量方面比較了Kafka和RabbitMQ,知道了Kafka的吞吐量要高於RabbitMQ。本文從可靠性方面繼續探討兩個佇列的差異。 RabbitMQ可靠性 我們通過前文知道,RabbitMQ的佇列分為master queue和mirror

C++有序map無序unordered_map效能測試對比

概述 簡單對比map和unordered_map的效能。 map內部是紅黑樹,在插入元素時會自動排序,而無序容器unordered_map內部是散列表,通過雜湊而不是排序來快速操作元素,使得效率更高。當你不需要排序時選擇unordered_map的效率更高。

RabbitMQKafka對比以及場景使用說明

1.架構模型     rabbitmq     RabbitMQ遵循AMQP協議,RabbitMQ的broker由Exchange,Binding,queue組成,其中exchange和binding組成了訊息的路由鍵;客戶端Producer通過連線channel和ser

RabbitMQkafka比較

在應用場景方面 RabbitMQ,遵循AMQP協議,由內在高併發的erlanng語言開發,用在實時的對可靠性要求比較高的訊息傳遞上。 kafka是Linkedin於2010年12月份開源的訊息釋出訂閱系統,它主要用於處理活躍的流式資料,大資料量的資料處理上。

SATA硬碟SSD硬碟效能測試對比

測試工具: fio 測試物件: SATA硬碟, SSD硬碟 測試專案:順序讀、隨機讀、順序寫、隨機寫 1. 順序讀 測試命令:fio -name iops -rw=read -bs=4k -runtime=60 -iodepth 32 -filename /dev

raid0+1raid5的效能測試結果

網上關於效能比較和原理的文章很多,這裡不再過多解釋,只寫測試結果。測試目的:4塊物理硬碟,使用IBMraid卡做raid。4塊做raid 5和兩塊盤分別raid 1的讀效能比較。由於寫會往本地盤寫入資料,暫時沒有測試工具:oracle orign 4塊物理盤做 raid 5

Mininet簡單效能測試

建一個簡單的模型,使用一個單交換機,然後連結n個主機形成拓撲,然後對每個鏈路設定頻寬,延遲時間,和丟包率。 這裡就選擇建一個單交換機和六個主機的作為例子。 建立py指令碼生成拓撲:寫一個類生成一個單交換機和六個主機的拓撲,並且給每個主機和交換機之間的連線賦予100m的頻寬,5ms的延遲和1%的丟包率。

合併排序(Merge Sort)C 實現(簡單效能測試

#include <time.h> #include <stdlib.h> #include <stdio.h> #define sential RAND_MAX  /* 定義哨兵*/ #define SIZE 1000000/

RabbitMQ Performance Testing Tool 效能測試工具

解壓檔案(放到 RabbitMQ 安裝目錄下) rabbitmq-perf-test-1.1.0.zip 測試(命令列執行): > cd D:\Program Files\RabbitMQ Server\rabbitmq-perf-test-1.1.0\b