Todos os produtos
Search
Central de documentação

DataHub:DataHub cost saving guide

Última atualização: Sep 21, 2026

Este tópico descreve o novo recurso de processamento em lote do DataHub, incluindo seu funcionamento e como implementá-lo. A mudança para o modo em lote melhora o desempenho e reduz os custos ao diminuir o consumo de recursos no lado do servidor e reduzir significativamente as taxas de uso.

Detalhes da atualize

Suporte à compactação zstd

O DataHub agora oferece suporte ao algoritmo de compactação Zstandard (zstd). Em comparação com os algoritmos lz4 e deflate, que também são compatíveis com o DataHub, o zstd oferece um desempenho superior.

Nota

O Zstandard (zstd) é um algoritmo de compactação de alto desempenho desenvolvido pelo Facebook e disponibilizado como código aberto em 2016. O algoritmo zstd se destaca tanto na velocidade quanto na taxa de compactação, o que o torna ideal para os cenários do DataHub.

Transformação de serialização

O DataHub introduz a serialização em lote, um método para organizar dados para transmissão. O termo "lote" não se refere a um método de serialização específico, mas sim a um encapsulamento secundário dos dados serializados. Por exemplo, para envie 100 registros de uma vez, os 100 registros são primeiro serializados em um buffer. Em seguida, um algoritmo de compactação é aplicado a esse buffer para crie um buffer compactado. Por fim, um cabeçalho é adicionado ao buffer compactado para armazenar metadados, como tamanho, número de registros de dados, algoritmo de compactação e uma soma de verificação CRC. Esse processo crie um buffer de lote completo.

Isso resolve os seguintes problemas:

  • Evita de forma eficaz dados incorretos na camada de negócios.

  • Reduz a sobrecarga de CPU no lado do servidor e melhora o desempenho do processamento de dados.

  • Diminui a latência de leitura e gravação simultâneas.

image
Nota

Como o cliente realiza verifique rigorosas de validade dos dados antes de envie um buffer de lote, é necessário que o servidor verifique apenas a soma de verificação CRC para confirmar se o buffer é válido. O buffer pode então ser gravado diretamente no disco. Esse processo elimina a necessidade de operações de serialização, desserialização, compactação, descompactação e validação no lado do servidor. Como resultado, o desempenho no lado do servidor melhora em mais de 80%. Como vários registros de dados são compactados juntos, a taxa de compactação também aumenta, o que reduz os custos de armazenamento.

Comparação de custos

O teste a seguir foi conduzido para verifique os efeitos do processamento em lote. O cenário do teste é o seguinte:

  • Os dados de teste consistem em informações de veiculação de anúncios com aproximadamente 200 colunas. Cerca de 20% a 30% dos valores dos dados são nulos.

  • 1.000 registros de dados por lote.

  • O Avro é usado para serialização dentro do lote.

  • O algoritmo de compactação zstd substitui o lz4, que era o algoritmo de compactação padrão nas versões anteriores.

O teste produziu os seguintes resultados:

Tamanho da source de dados (bytes)

Tamanho compactado com lz4 (bytes)

Tamanho compactado com zstd (bytes)

serialização protobuf

11.506.677

3.050.640

1.158.868

serialização em lote

11.154.596

2.931.729

1.112.693

O faturamento do DataHub é baseado em duas dimensões principais: armazenamento e tráfego. Outros itens faturáveis servem principalmente como penalidades para evitar o abuso de recursos. Portanto, os resultados do teste são analisados sob as perspectivas de armazenamento e tráfego.

  • Custos de armazenamento: ao usar a serialização protobuf, o DataHub não compacta os dados para armazenamento. A compactação dos dados ocorre apenas durante a transmissão http. Se você substituir esse método pelo processamento em lote e pela compactação zstd, o tamanho de armazenamento diminui de 11.506 KB para 1.112 KB. Isso reduz os custos de armazenamento em aproximadamente 90%.

  • Custos de tráfego: ao usar protobuf e lz4, o tamanho dos dados é de 3.050 KB. Ao usar o processamento em lote e zstd, o tamanho dos dados é de 1.112 KB. Isso reduz os custos de tráfego em aproximadamente 60%.

Importante

Os resultados anteriores são baseados em dados de amostra. Seus resultados reais podem variar dependendo dos seus dados. Recomendamos que você execute seus próprios testes conforme necessário.

Uso do processamento em lote

Nota

Observações

  • O principal benefício da gravação em lote é maximizar o número de registros em cada lote. Se o cliente não conseguir agrupar os registros em lote, ou se o número de registros por lote for pequeno, a melhoria de desempenho pode não ser significativa.

  • Para garantir uma transição tranquila, o modo em lote é compatível com os métodos originais de leitura e gravação. Os dados gravados no modo em lote podem ser lidos no modo original e vice-versa. No entanto, para obter o melhor desempenho, escreva e consuma os dados no mesmo modo. Mismatched writing and consumption degrades performance.

Importante

A versão mais recente do DataHub não exige mais a ative do esquema de várias versões para um tópico para usar o protocolo em lote. No entanto, atualize seu cliente para uma versão compatível. A tabela a seguir lista os clientes compatíveis e suas versões necessárias.

Linguagem

Status de suporte

Requisito de versão

Java SDK

Compatível

1.5.1 ou posterior

Go SDK

Compatível

1.1.0 ou posterior

Python

Não compatível

-

C++

Não compatível

-

Exemplo em Java

Nas versões 1.5.1 e posteriores, o protocolo de serialização padrão é o Batch. Nenhuma configuração especial é necessária. Você pode gravar dados normalmente, usando gravações síncronas ou assíncronas.

Dependência do Maven
<dependency>
  <groupId>com.aliyun.datahub</groupId>
  <artifactId>datahub-client-library</artifactId>
  <version>1.5.1</version>
</dependency>
Exemplo de código
public static void main(String[] args) throws InterruptedException {
	// Obtain AccessKey information from an environment variable.
	EnvironmentVariableCredentialProvider provider = EnvironmentVariableCredentialProvider.create();

	String endpoint ="https://dh-cn-hangzhou.aliyuncs.com";
	String projectName = "test_project";
	String topicName = "test_topic";

	// Initialize the producer. The default configurations are used.
	ProducerConfig config = new ProducerConfig(endpoint, provider);
	DatahubProducer producer = new DatahubProducer(projectName, topicName, config);

	RecordSchema schema = producer.getTopicSchema();
	// If a multi-version schema is enabled, you can also get the schema of a specified version.
	// RecordSchema schema = producer.getTopicSchema(3);

	// For an asynchronous write, register a callback function as needed.
	WriteCallback callback = new WriteCallback() {
		@Override
		public void onSuccess(String shardId, List<RecordEntry> records, long elapsedTimeMs, long sendTimeMs) {
			System.out.println("write success");
		}

		@Override
		public void onFailure(String shardId, List<RecordEntry> records, long elapsedTimeMs, DatahubClientException e) {
			System.out.println("write failed");
		}
	};

	for (int i = 0; i < 10000; ++i) {
		try {
            // Generate data by schema.
            TupleRecordData data = new TupleRecordData(schema);
            data.setField("field1", "hello");
            data.setField("field2", 1234);
            RecordEntry recordEntry = new RecordEntry();
            recordEntry.setRecordData(data);

            producer.sendAsync(recordEntry, callback);
            // If you do not need to confirm whether the data was sent successfully, do not register a callback. Send the data directly.
            // producer.sendAsync(recordEntry, null);
        } catch (DatahubClientException e) {
            // TODO: Handle exceptions, which are typically non-retriable errors or errors that occur after the maximum number of retries.
            Thread.sleep(1000);
        }
	}

	// Ensure that all data is sent before the program exits.
	producer.flush(true);
	producer.close();
}

Exemplo em Go

Dependência do go.mod
require (
	github.com/aliyun/aliyun-datahub-sdk-go v1.1.0
)
Exemplo de código

Nas versões 1.1.0 e posteriores, o protocolo de serialização padrão é o Batch. Nenhuma configuração especial é necessária. Você pode gravar dados normalmente, usando gravações síncronas ou assíncronas.

func handleSuccessRun(producer datahub.AsyncProducer) {
	for suc := range producer.Successes() {
		// handle request success
		fmt.Printf("shard:%s, rid:%s, records:%d, latency:%v\n",
			suc.ShardId, suc.RequestId, len(suc.Records), suc.Latency)
	}
}

func handleFailedRun(producer datahub.AsyncProducer) {
	// handle request failed
	for err := range producer.Errors() {
		fmt.Printf("shard:%s, records:%d, latency:%v, error:%v\n",
			err.ShardId, len(err.Records), err.Latency, err.Err)
	}
}

func main() {
	cfg := datahub.NewProducerConfig()

    // Obtain AccessKey information from an environment variable.
	credential, err := credentials.NewCredential(nil)
	if err != nil {
		fmt.Println(err)
		// TODO: handle error
	}
	cfg.Account = datahub.NewCredentialAccount(credential)
	cfg.Endpoint = "https://dh-cn-hangzhou.aliyuncs.com"
	cfg.Project = "test_project"
	cfg.Topic = "test_topic"

	producer := datahub.NewAsyncProducer(cfg)
	err = producer.Init()

	if err != nil {
		// TODO: handle error
		fmt.Println(err)
	}

	schema, err := producer.GetSchema()
	if err != nil {
		// TODO: handle error
		fmt.Println(err)
	}

	// Handle the success channel.
	go handleSuccessRun(producer)

	// Handle the error channel.
	go handleFailedRun(producer)

	// Generate data in a loop.
	for i := 0; i < 1000; i++ {
		record := datahub.NewTupleRecord(schema)
        // Each time you set a value, check if the operation was successful.
		err = record.SetValueByName("f1", "val1")
		if err != nil {
			fmt.Println(err)
			return
		}

		err = record.SetValueByName("f2", 1234)
		if err != nil {
			fmt.Println(err)
			return
		}

		producer.Input() <- record
	}

	err = producer.Close()
	if err != nil {
		fmt.Println(err)
	}
}

Suporte

Caso tenha dúvidas ou problemas, envie um ticket para obter suporte ou participe do nosso grupo de usuários. O número do grupo é 33517130.