kafka - rabbitmq c#
NServiceBus y Rabbit MQ o Kafka (2)
Estoy tratando de aprender el sistema de mensajería. He descubierto que RabbitMq y NServiceBus se usan juntos en pocos lugares. Mis preguntas son
- Si estoy usando RabbitMQ, ¿por qué necesito NServiceBus? y viceversa
- ¿Qué puede hacer NServiceBus pero RabbitMQ o Kafka no?
- ¿Puedo usar NServiceBus y kafka juntos? O Apache-Kafka no requiere NServiceBus
Hace años, me hice la misma pregunta. Estaba mirando NServiceBus para trabajar con una cola de mensajes diferente, pero la pregunta era la misma.
Decidí no usar NServiceBus.
6 meses después, me di cuenta de que había reconstruido la mitad de lo que NServiceBus hizo ... solo que mucho peor.
La pregunta equivalente de por qué necesitaría NServiceBus con RabbitMQ es preguntar por qué necesitaría .NET Framework con ASP.NET MVC, o WinForms, o XAML, o cualquiera de las bibliotecas integradas con las que .NET se envía, cuando tienes el Common Language Runtime.
¿No debería ser suficiente el CLR, después de todo?
Por supuesto no. Tener el tiempo de ejecución en el que se puede ejecutar el código, el intérprete MSIL y el motor de ejecución, no es suficiente para ser productivo.
Claro, puede escribir aplicaciones de línea de comandos que toman entrada y producen salida. Pero intente crear una aplicación real sin las bibliotecas comunes, sin los controladores de SQL Server incorporados; sin ningún control o biblioteca de terceros. Cree una aplicación de escritorio de Windows sin el espacio de nombres System.Windows.
Necesita esas bibliotecas para proporcionarle colecciones y acceso a la base de datos, y objetos de ventana y controles de IU.
Del mismo modo, RabbitMQ le brinda todo lo que necesita para comenzar y trabajar, pero no lo suficiente para mantener la productividad.
Claro, puede tomar el controlador .NET para RabbitMQ y comenzar a producir y consumir mensajes.
Por un tiempo, esto funcionará bien.
Muy pronto, se encontrará creando un envoltorio alrededor del controlador, para que pueda reducir la cantidad de código que necesita escribir.
Luego, tendrá que lidiar con ack vs nack, y creará una API simple para eso.
Luego, la necesidad de colas de mensajes no entregados aparecerá con llamadas de prueba, y lo envolverá en su API, simplificado en comparación con el controlador rabbitmq, por supuesto.
Eventualmente, querrá lidiar con los mensajes de envenenamiento, mensajes que están mal formados y que causan excepciones. Una vez más, no desea escribir código único para esto, por lo que escribirá una biblioteca para manejarlo.
La lista sigue y sigue.
Dentro de 6 meses, se encontrará trabajando con una biblioteca no verificable, apenas especificada y medio escrita que solo imita el valor y las capacidades de NServiceBus (o Mass Transit o cualquier otra biblioteca de bus de servicio que elija).
No diré que tienes que usar NServiceBus. Y yo diría que deberías aprender cómo funciona RabbitMQ, sin él. Pero una vez que va más allá de lo básico de enviar y recibir mensajes, el valor de NServiceBus y otras implementaciones de bus de servicio se vuelve muy evidente, muy rápidamente.
Parece que ahora hay soporte comunitario para el transporte de Kafka en NServiceBus: https://docs.particular.net/nservicebus/kafka/ (no lo he probado todavía).