github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/app/rpc/pendingtx/kafka.go (about)

     1  package pendingtx
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  
     7  	"github.com/segmentio/kafka-go"
     8  )
     9  
    10  type KafkaClient struct {
    11  	Topic string
    12  	*kafka.Writer
    13  }
    14  
    15  func NewKafkaClient(addrs []string, topic string) *KafkaClient {
    16  	return &KafkaClient{
    17  		Topic: topic,
    18  		Writer: kafka.NewWriter(kafka.WriterConfig{
    19  			Brokers:  addrs,
    20  			Topic:    topic,
    21  			Balancer: &kafka.Hash{},
    22  			Async:    true,
    23  		}),
    24  	}
    25  }
    26  
    27  func (kc *KafkaClient) SendPending(hash []byte, tx *PendingTx) error {
    28  	kafkaMsg := PendingMsg{
    29  		Topic: kc.Topic,
    30  		Data:  tx,
    31  	}
    32  
    33  	msg, err := json.Marshal(kafkaMsg)
    34  	if err != nil {
    35  		return err
    36  	}
    37  
    38  	// Automatic retries and reconnections on errors.
    39  	return kc.WriteMessages(context.Background(),
    40  		kafka.Message{
    41  			Key:   hash,
    42  			Value: msg,
    43  		},
    44  	)
    45  }
    46  
    47  func (kc *KafkaClient) SendRmPending(hash []byte, tx *RmPendingTx) error {
    48  	kafkaMsg := RmPendingMsg{
    49  		Topic: kc.Topic,
    50  		Data:  tx,
    51  	}
    52  
    53  	msg, err := json.Marshal(kafkaMsg)
    54  	if err != nil {
    55  		return err
    56  	}
    57  
    58  	// Automatic retries and reconnections on errors.
    59  	return kc.WriteMessages(context.Background(),
    60  		kafka.Message{
    61  			Key:   hash,
    62  			Value: msg,
    63  		},
    64  	)
    65  }