Motivasi penulisan artikel ini adalah adanya peningkatan tampilan materi pemasaran tentang Apache Kafka di habr.com. Dan juga fakta bahwa artikel memberi kesan bahwa ditulis oleh orang-orang yang agak jauh dari kegunaan sebenarnya tentu saja hanya kesan, tetapi untuk beberapa alasan, sebagian besar artikel tentu berisi perbandingan Apache Kafka dengan RabbitMQ, dan tidak mendukung yang terakhir. Yang paling menarik adalah dengan membaca artikel semacam itu, manajer tanpa latar belakang teknis mulai mengeluarkan uang untuk penelitian internal sehingga pengembang dan direktur teknis terkemuka memilih salah satu solusi. Karena saya sangat rakus / rendah hati, dan juga karena saya adalah pendukung tesis "Kebenaran TIDAK lahir dalam perselisihan", saya sarankan Anda membiasakan diri dengan pendekatan yang berbeda - hampir tanpa membandingkan broker yang berbeda.
Tidak ada perbandingan di mana pun
Secara umum, dengan cara yang benar, saya seharusnya membuat artikel dalam format Kafka+RabbitMQ+Nats+ActiveMQ+Mosquito+etc
, tetapi bagi saya bagi Anda para pembaca yang budiman itu akan berlebihan, meskipun biasanya semua layanan di atas (dan tidak hanya) hadir dalam solusi arsitektur saya. Dan saya belum membicarakan hal ini tentang AzureServiceBus / AmazonServiceBus - yang juga berpartisipasi dalam "hibrid" dalam program proyek besar. Oleh karena itu, untuk saat ini, mari kita bahas bundel Kafka + RabbitMQ, dan kemudian Anda akan mengerti alasannya: dengan analogi, Anda dapat menghubungkan layanan apa pun dengan protokolnya. Karena:
membandingkan Apache Kafka dan RabbitMQ Anda membandingkan 2 (dua) merek, atau lebih tepatnya 2 perusahaan komersial - Confluent dan vmWare, dan sedikit Apache Software Foundation (tetapi ini bukan perusahaan)
Artinya, secara formal, saat membandingkan, kita harus membandingkan model bisnis perusahaan yang menjadi pendorong utama pengembangan mata pelajaran eksperimental kita saat ini. Karena Habr masih bukan portal penelitian ekonomi, maka sebagai permulaan kita harus mengingat bukan mereknya, tetapi deskripsi yang ada di balik merek-merek ini (cara peserta kami saat ini menyebut diri mereka sendiri).
- RabbitMQ adalah broker pesan multi-protokol dan dapat diperluas
- Apache Kafka adalah platform streaming acara terdistribusi
- Confluent Platform - platform streaming acara dengan kemampuan untuk membuat pipeline data berkinerja tinggi untuk analitik dan integrasi dalam skenario bisnis
Confluent â Apache Kafka Confluent Apache Kafka. SchemeRegistry
, RestProxy
, kSQL
, , Kafka-Connect
.
â , RabbitMQ "", Kafka - ( ).
â , .
- RabbitMQ â . ( Erlang)
- Kafka â ( Scala/Java)
- RabbitMQ . , .
- Kafka , .
,
: , , - , , â
,
->
->
â . 14 , , "" ( ), .
- ODBC
- AMQP
- MSMQ
- XMPP
- IP over Avian Carriers
(python, C#, java) 1 â One-S-Connectors
(https://code.google.com/archive/p/one-c-connectors/source/default/source). ( 1 1 " 1-" â ).
( 2006 ) , / -. . ODBC Kafka/NATs/ModBus.
â ( )
, â 1-, .
- Kombu ( Python) â https://docs.celeryproject.org/projects/kombu/en/stable/introduction.html#transport-comparison
- CAP .NetCore â https://github.com/dotnetcore/CAP
Kombu â , Apache Kafka https://github.com/celery/kombu/issues/301 - " ", Python https://github.com/confluentinc/confluent-kafka-python
â , : Java, GoLang, RUST, etc. NATs ActiveMQ JMS â : Java ,
- https://github.com/rabbitmq/rabbitmq-server/tree/master/deps/
- https://docs.confluent.io/current/connect/kafka-connect-rabbitmq/index.html
- https://github.com/84codes/kafka-connect-rabbitmq/blob/master/docker-compose.yml
? , , " " â RabbitMQ ( /deps
) RabbitMQ, Confluent Apache Kafka .
PostgreSQL âCREATE EXTENSION hypopg
, Pivotal/vmWare
â " " â 84Codes
https://github.com/84codes. â 84Codes , / CloudAMQP CloudKarafka.
, , 2 :
- vmWare , RabbitMQ â . , GitHub.
- Confuent Enterprise Enterprise-Kafka-Connect, GUI .
- https://github.com/jcustenborder/kafka-connect-rabbitmq, , Java Maven Archetype https://github.com/jcustenborder/kafka-connect-archtype â , Confluent , Kafka .
Kafka
, Java, Enterprise . RabbitMQ
, (Erlang ), 84Codes
. Erlang â , OpenStack.
â
. , , ITILv4, 3
- ProtocolLock VendorLock â , , - â : .
- , â .
- â
3
âTDD, BDD, CICD, ScallableAgile DevOps (DocOps, DevSecOps)
â . TimeToMarket.
, , Docker-Compose. â () â , . â Kafka+RabbitMQ 84Codes
( â https://www.84codes.com/).
, . , , , Apache Kafka exactly-ones
. â , ->
Kafka ( Topic
) â Offsets
.
exactly-ones â " 1", Exactly once â , .
. :
- Zookeper
- KafkaBroker
- RabbitMQ
- KafkaConnect
- Python AMQP 0.9
- # AMQP 1.0
- C# Kafka
: Apache Kafka â ( ) Java, , librdkafka â C++ - ,. Kafka , " ": , https://github.com/edenhill/librdkafka/pulse/monthly, wmWare https://github.com/rabbitmq
:
RabbitMQ-Kafka-Sinc-Connector
â Confluent Github.
2 â - -.
RabbitMQ Kafka
â
docker-compose -f dockers/infra.yml up -d
, , , Kafka-UI RabbitMQ-Sinc, Kafka RabbitMQ
image: provectuslabs/kafka-ui:latest ports: - 8080:8080 depends_on: - kafka-broker - zookeeper environment: KAFKA_CLUSTERS_0_NAME: local KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: broker:29092 KAFKA_CLUSTERS_0_ZOOKEEPER: zookeeper:2181 KAFKA_CLUSTERS_0_JMXPORT: 9101
Java
<parent>
<groupId>com.github.jcustenborder.kafka.connect</groupId>
<artifactId>kafka-connect-parent</artifactId>
<version>1.0.0</version>
</parent>
pom.xml â , https://github.com/jcustenborder/kafka-connect-parent, Java-Kafka-Adapter
c RMQ Java â https://www.rabbitmq.com/java-client.html
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>${rabbitmq.version}</version>
â , , :
- java â
-1-build-connect-jar.bat
- â
00-build-connect-image.sh
- â
01-start-infra.sh
â Docker PWD Windows Linux â . â sh

RabbitMQ :
:
- 9092 â Kafka
- 8080 â Apache Kafka UI
- 5672 â AMQP 0.9 AMQP 1.0
- 15672 â RabbitMQ
- 28082 â
curl
RabbitMQ Docker:
- â
enabled-rmq-plugins
[ rabbitmq_management, rabbitmq_amqp1_0, rabbitmq_mqtt, rabbitmq_federation, rabbitmq_federation_management, rabbitmq_shovel, rabbitmq_shovel_management, rabbitmq_prometheus ].
- , â
rmq_definitions.json
"bindings":[
{
"source":"orders-send",
"vhost":"/",
"destination":"orders-amqp-10-consumer",
"destination_type":"queue",
"routing_key":"",
"arguments":{
docker-compose -f dockers/infra.yml restart protocol-connect-sync docker-compose -f applications.yml build docker-compose -f applications.yml up

:
- -
2
producer = conn.Producer(serializer='json') producer.publish({'client': '', 'count': 10, 'good': ''}, exchange=order_exchange, declare=[kafka_queue, amqp10_queue]) time.sleep(2)
RUN python -m pip install \ kombu \ librabbitmq
AMQP 0.9 â librabbitmq https://github.com/alanxz/rabbitmq-c
- AMQP 1.0 â , . .
Attach recvAttach = new Attach()
{
Source = new Source()
{
Address = "orders-amqp-10-consumer",
Durable = 1,
},
ReceiverLink receiver =
new ReceiverLink(session,"netcore_amqp_10_consumer", recvAttach, null);
Console.WriteLine("Receiver connected to broker.");
while (true) {
Message message = receiver.Receive();
if (message == null)
{
Console.WriteLine("Client exiting.");
break;
}
Console.WriteLine("Received "
+ System.Text.Encoding.UTF8.GetString((byte[])message.Body)
<ItemGroup> <PackageReference Include="AMQPNetLite.Core" Version="2.4.1" /> </ItemGroup>
https://github.com/Azure/amqpnetlite Microsoft . AMQP 1.0 https://docs.microsoft.com/ru-ru/azure/service-bus-messaging/service-bus-amqp-overview
- Kafka â . Exactly once.
AutoOffsetReset = AutoOffsetReset.Earliest
c.Subscribe("orders-from-amqp");
while (true)
{
try
{
var cr = c.Consume(cts.Token);
:
- 5

- 3

- Kafka-Ui

- RabbitMQ

Java ?
â , , Kafka-Connect-Base
[submodule "dockers/rabbitmq-kafka-sink"] path = dockers/rabbitmq-kafka-sink url = https://github.com/aliczin/kafka-connect-rabbitmq
, Kafka-Connect â .
:
public class RabbitMQSourceTask extends SourceTask {
this.channel.basicConsume(queue, this.consumer);
log.info("Setting channel.basicQos({}, {});", this.config.prefetchCount, this.config.prefetchGlobal);
this.channel.basicQos(this.config.prefetchCount, this.config.prefetchGlobal);
- .
@Override
public List<SourceRecord> poll() throws InterruptedException {
List<SourceRecord> batch = new ArrayList<>(4096);
while (!this.records.drain(batch)) {
AMQP 0.9 . Java . J2EE.
private static final Logger log = LoggerFactory.getLogger(MessageConverter.class);
static final String FIELD_ENVELOPE_DELIVERYTAG = "deliveryTag";
static final String FIELD_ENVELOPE_ISREDELIVER = "isRedeliver";
static final String FIELD_ENVELOPE_EXCHANGE = "exchange";
static final String FIELD_ENVELOPE_ROUTINGKEY = "routingKey";
static final Schema SCHEMA_ENVELOPE = SchemaBuilder.struct()
.name("com.github.jcustenborder.kafka.connect.rabbitmq.Envelope")
.doc("Encapsulates a group of parameters used for AMQP's Basic methods. See " +
"`Envelope <https://www.rabbitmq.com/releases/rabbitmq-java-client/current-javadoc/com/rabbitmq/client/Envelope.html>`_")
.field(FIELD_ENVELOPE_DELIVERYTAG, SchemaBuilder.int64().doc("The delivery tag included in this parameter envelope. See `Envelope.getDeliveryTag() <https://www.rabbitmq.com/releases/rabbitmq-java-client/current-javadoc/com/rabbitmq/client/Envelope.html#getDeliveryTag-->`_").build())
.field(FIELD_ENVELOPE_ISREDELIVER, SchemaBuilder.bool().doc("The redelivery flag included in this parameter envelope. See `Envelope.isRedeliver() <https://www.rabbitmq.com/releases/rabbitmq-java-client/current-javadoc/com/rabbitmq/client/Envelope.html#isRedeliver-->`_").build())
.field(FIELD_ENVELOPE_EXCHANGE, SchemaBuilder.string().optional().doc("The name of the exchange included in this parameter envelope. See `Envelope.getExchange() <https://www.rabbitmq.com/releases/rabbitmq-java-client/current-javadoc/com/rabbitmq/client/Envelope.html#getExchange-->`_"))
.field(FIELD_ENVELOPE_ROUTINGKEY, SchemaBuilder.string().optional().doc("The routing key included in this parameter envelope. See `Envelope.getRoutingKey() <https://www.rabbitmq.com/releases/rabbitmq-java-client/current-javadoc/com/rabbitmq/client/Envelope.html#getRoutingKey-->`_").build())
.build();
âĻ , â . .
Github.
â https://github.com/aliczin/hybrid-eventing. Creative Commons Attribution 4.0 International.
â DevOps . , â , .
" " () â
orderEventsApp->Amqp09: send order Amqp09->Amqp10: fanout\n copy event Amqp09->KafkaQ: fanout\n copy event KafkaQ->KafkaConnect: consume\n on message KafkaConnect->KafkaConnect: transform\n message KafkaConnect->Kafka: publish to topic

â
Amqp10->orderEventSubApp: subcribe\n for event orderJournalApp->Kafka: read kafka journal

Apache Kafka Java , librdkafka â
KafkaAPI
. Java .
, RabbitMQ/Kafka/Nats/ActiveMQ â -.
Docker, .
:
Mosquito â SCADA ModBus/OPC-UA. â " " â https://github.com/mainflux/mainflux
ActiveMQ â Java , Erlang, â
RabbitMQ AMQP 1.0 -> ActiveMQ
RabbitMQ, JMS.
NATs â
OpenFaaS
, " "Amazon Lambda
. â : https://github.com/nats-io/nats-kafka â OpenFaaS 1- â 2.5 https://youtu.be/8sF-oGGVa9M
(/ â : ) /, - , , . " "
: Produser/Consumer : vmWare Stream RabbitMQ vmWare RabbitMQ : 1- ActiveMQ 1 1 Kafka API ActivemeMQ2Kafka 1 etc
, â â : https://github.com/fclairamb/ftpserver/pull/34 â FTP , S3.
â : : .
- . DevOps k8s, OpenShift, etc â , - .
- â PRODUCTION-READY .
( ) , - :
HTTP, AMQP 0.9, AMQP 1.0, Apache Kafka 23, MQTT, WebSockets, <SOAP>
. 1 â . Google 1+RabbitMQ 1+Kafka 1+OpenFaas
â RabbitMQ Kafka " 1" . 1 â , . Java/C#/Python/C++/Rust/etc.
https://shd101wyy.github.io/markdown-preview-enhanced Visual Studio Code â .
Nah, sebagai poin terakhir, saya ingin mencatat bahwa pilihan ekosistem JDK Cunfluent Inc
sebagai platform pengembangan Kafka-Connect
terlihat aneh. Saya tidak akan terkejut jika pesaing mereka melakukan hal yang sama, tetapi di GoLang, NodeJS (sesuatu seperti Kafka-Beats-Hub
)

Saya membuat gambar-gambar cantik dalam format GraphViz menggunakan proyek pintar Docker2GraphViz - ini membantu untuk menjaga garis besar dan dokumentasi teknis dalam format penurunan harga tetap mutakhir
set CURPATH=%~dp0 set DOCKER_DIR=%CURPATH%\dockers docker run --rm -it --name dcv -v %DOCKER_DIR%\:/input pmsipilot/docker-compose-viz render -m image --force --output-file=infra-topology.png infra.yml docker run --rm -it --name dcv -v %CURPATH%\:/input pmsipilot/docker-compose-viz render -m image --force --output-file=apps-topology.png applications.yml copy /b/v/y dockers\infra-topology.png content\assets\infra-topology.png copy /b/v/y apps-topology.png content\assets\apps-topology.png