Inviare/produrre json messaggio attraverso kafka

0

Domanda

Questa è la mia prima volta con Kafka e sto pensando di utilizzare kafka con .net

Volevo sapere se posso inviare JSON come un messaggio quando la produzione di un evento

Sto seguendo il tutorial: https://developer.confluent.io/get-started/dotnet/#build-producer

Inoltre, c'è un modo per il valore di essere associato ad un modello in modo che il valore/struttura json è sempre legato a quel modello

Così, per esempio: se voglio che il mio json valore

{
  "customerName":"anything",
  "eventType":"one-of-three-enums",
  "columnsChanged": "string value or something"
}

La maggior parte degli esempi che posso trovare sono come questo:

using Confluent.Kafka;
using System;
using Microsoft.Extensions.Configuration;

class Producer {
    static void Main(string[] args)
    {
        if (args.Length != 1) {
            Console.WriteLine("Please provide the configuration file path as a command line argument");
        }

        IConfiguration configuration = new ConfigurationBuilder()
            .AddIniFile(args[0])
            .Build();

        const string topic = "purchases";

        string[] users = { "eabara", "jsmith", "sgarcia", "jbernard", "htanaka", "awalther" };
        string[] items = { "book", "alarm clock", "t-shirts", "gift card", "batteries" };

        using (var producer = new ProducerBuilder<string, string>(
            configuration.AsEnumerable()).Build())
        {
            var numProduced = 0;
            const int numMessages = 10;
            for (int i = 0; i < numMessages; ++i)
            {
                Random rnd = new Random();
                var user = users[rnd.Next(users.Length)];
                var item = items[rnd.Next(items.Length)];

                producer.Produce(topic, new Message<string, string> { Key = user, Value = item },
                    (deliveryReport) =>
                    {
                        if (deliveryReport.Error.Code != ErrorCode.NoError) {
                            Console.WriteLine($"Failed to deliver message: {deliveryReport.Error.Reason}");
                        }
                        else {
                            Console.WriteLine($"Produced event to topic {topic}: key = {user,-10} value = {item}");
                            numProduced += 1;
                        }
                    });
            }

            producer.Flush(TimeSpan.FromSeconds(10));
            Console.WriteLine($"{numProduced} messages were produced to topic {topic}");
        }
    }
}

Vorrei la voce di una classe in struttura json.

.net apache-kafka asp.net-core
2021-11-23 21:53:21
1

Migliore risposta

0

volevo sapere se posso inviare JSON come un messaggio quando la produzione di un evento

Sì. Kafka negozi di byte e di convertire i byte utilizzando Serializzatori. Quando la costruzione di un Produttore, si ha la possibilità di chiamare SetValueSerializer.

Alcuni built-in serializzatori può essere trovato alla - https://github.com/confluentinc/confluent-kafka-dotnet/blob/master/src/Confluent.Kafka/Serializers.cs

Hai bisogno di scrivere il proprio modo generico di gestire qualsiasi JSON tipi di modello.

Quando si utilizza il Utf8Serializer per le stringhe, è necessario pre-serializzare l'oggetto dalla classe del modello, quindi lo invia come valore. Nel tuo esempio, devi sostituire var item con qualche oggetto serializzato.

Come faccio a trasformare un oggetto di C# in una stringa JSON in .NET?

Quando si utilizzano le classi del modello, i dati saranno tipicamente fortemente tipizzato fino a quando si avvia la scrittura manuale del JSON o utilizzare il Dizionario tipi. Se si voleva esterni messaggio di convalida, Confluenti Schema del Registro di sistema è un esempio che supporta JSONSchema e il JsonSerializer da confluent-dotnet-kafka il progetto supporta questo.

2021-11-23 22:27:28

Solo un follow-up domande. Sapete se si può limitare la dimensione del messaggio e c'è un modo per produttore per verificare qual è la dimensione dell'evento prima dell'invio e non consentono di inviare il messaggio, se la dimensione è più il limite massimo?
Learn AspNet

Kafka ha un limite predefinito di 1MB messaggio lotti. Se si ottiene la dimensione della matrice di byte serializzati, che dovrebbe essere una stretta approssimazione di un singolo formato di registrazione (c'è un overhead aggiuntivo come registrare le intestazioni e gli orari, però)
OneCricketeer

Grazie. Potete per favore rispondere: stackoverflow.com/questions/70097676/...
Learn AspNet

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................