LZ4 adalah algoritma kompresi data tanpa kehilangan informasi yang digunakan untuk mengompres dan mendekompres data secara efisien. Beberapa operasi API dari Simple Log Service mendukung LZ4. Menggunakan LZ4 untuk mengompres data dapat mengurangi lalu lintas jaringan, menurunkan biaya lalu lintas, serta meningkatkan kecepatan akses API Simple Log Service.
Kompres badan permintaan HTTP
Saat memanggil operasi API berikut, badan permintaan HTTP dapat dikompres menggunakan LZ4:
Untuk menggunakan LZ4 dalam mengompres badan permintaan HTTP, ikuti langkah-langkah berikut:
Tambahkan x-log-compresstype: lz4 ke header permintaan HTTP.
Gunakan LZ4 untuk mengompres badan permintaan HTTP.
Atur parameter x-log-bodyrawsize di header permintaan HTTP menjadi ukuran asli badan permintaan.
Atur parameter Content-Length di header permintaan HTTP menjadi ukuran kompresi badan permintaan.
Kompres respons
Saat memanggil operasi PullLogs, respons dapat dikompres menggunakan LZ4.
Metode:
Atur parameter Accept-Encoding menjadi lz4 di header permintaan. Kemudian, sisi server akan mengembalikan respons yang telah dikompres menggunakan LZ4.
Parameter x-log-bodyrawsize di header permintaan yang dikembalikan menentukan ukuran asli badan permintaan. Gunakan parameter ini saat mendekompres badan permintaan.
Contoh
Log Mentah
Ambil file log-sample.json sebagai contoh. Contoh berikut hanya untuk referensi. Informasi yang terkandung dalam permintaan dan respons bervariasi sesuai dengan struktur data aktual log mentah saat Anda memanggil operasi API Simple Log Service:
{
"__tags__": {},
"__topic__": "",
"__source__": "47.100.XX.XX",
"__logs__": [
{
"__time__": "03/22 08:51:01",
"content": "*************** RSVP Agent started ***************",
"method": "main",
"level": "INFO"
},
{
"__time__": "03/22 08:51:01",
"content": "Specified configuration file: /u/user10/rsvpd1.conf",
"method": "locate_configFile",
"level": "INFO"
},
{
"__time__": "03/22 08:51:01",
"content": "Using log level 511",
"method": "main",
"level": "INFO"
},
{
"__time__": "03/22 08:51:01",
"content": "Get TCP images rc - EDC8112I Operation not supported on socket",
"method": "settcpimage",
"level": "INFO"
},
{
"__time__": "03/22 08:51:01",
"content": "Associate with TCP/IP image name = TCPCS",
"method": "settcpimage",
"level": "INFO"
},
{
"__time__": "03/22 08:51:02",
"content": "registering process with the system",
"method": "reg_process",
"level": "INFO"
},
{
"__time__": "03/22 08:51:02",
"content": "attempt OS/390 registration",
"method": "reg_process",
"level": "INFO"
},
{
"__time__": "03/22 08:51:02",
"content": "return from registration rc=0",
"method": "reg_process",
"level": "INFO"
}
]
}
Prosedur Pengujian
Kode Python berikut menunjukkan prosedur kompresi data:
from lz4 import block
with open('log-sample.json', 'rb') as f:
data = f.read()
compressed=block.compress (data, store_size=False) # Kompres data:
print(f'out/in: {len(compressed)}/{len(data)} Bytes')
print(f'Rasio kompresi: {len(compressed)/len(data):.2%}')
Hasil
Hasil kompresi file log-sample.json dikembalikan. Rasio kompresi adalah 39,30%. Rasio kompresi bergantung pada isi data. Jika data berisi banyak konten berulang, rasio kompresi akan lebih tinggi:
out/in: 542/1379 Bytes
Rasio kompresi: 39,30%
Kode contoh
Go
Instal pustaka dependen:
go get github.com/pierrec/lz4
Kode contoh:
import (
"fmt"
"log"
lz4 "github.com/cloudflare/golz4"
)
func main() {
data := []byte("hello world, hello golang")
// Kompres data.
compressed := make([]byte, lz4.CompressBound(data))
compressedSize, err := lz4.Compress(data, compressed)
if err != nil {
log.Fatal(err)
}
compressed = compressed[:compressedSize]
// Dekompres data.
bodyRawSize := len(data) // Anda dapat menggunakan parameter x-log-bodyrawsize di header permintaan HTTP yang dikembalikan untuk mendekompres data.
decompressed := make([]byte, bodyRawSize)
err = lz4.Uncompress(compressed, decompressed)
if err != nil {
log.Fatal(err)
}
decompressed = decompressed[:bodyRawSize]
}
Python
Instal pustaka dependen:
python3 -m pip install lz4
Kode contoh:
from lz4 import block
data = b'hello world, hello sls'
# Kompres data.
compressed = block.compress(data, store_size=False)
# Dekompres data.
body_raw_size=len(data) # Anda dapat menggunakan parameter x-log-bodyrawsize di header permintaan HTTP yang dikembalikan untuk mendekompres data.
decompressed = block.decompress(compressed, uncompressed_size=body_raw_size)
Java
Tambahkan dependensi Maven:
<dependency>
<groupId>net.jpountz.lz4</groupId>
<artifactId>lz4</artifactId>
<version>1.3.0</version>
</dependency>
Kode contoh:
package sample;
import net.jpountz.lz4.LZ4Compressor;
import net.jpountz.lz4.LZ4Factory;
import net.jpountz.lz4.LZ4FastDecompressor;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
public class Sample {
public static void main(String[] args) throws IOException {
byte[] data = "hello world, hello sls".getBytes();
// Kompres data.
LZ4Compressor compressor = LZ4Factory.fastestInstance().fastCompressor();
int maxLen = compressor.maxCompressedLength(data.length);
byte[] buffer = new byte[maxLen];
int compressedSize = compressor.compress(data, 0, data.length, buffer, 0, maxLen);
// Salin buffer ke parameter kompresi.
byte[] compressed = new byte[compressedSize];
System.arraycopy(buffer, 0, compressed, 0, compressedSize);
// Dekompres data.
int bodyRawSize = data.length; // Anda dapat menggunakan parameter x-log-bodyrawsize di header permintaan HTTP yang dikembalikan untuk mendekompres data.
LZ4FastDecompressor decompressor = LZ4Factory.fastestInstance().fastDecompressor();
byte[] decompressed = new byte[bodyRawSize];
decompressor.decompress(compressed, 0, decompressed, 0, bodyRawSize);
}
}
JavaScript
Gunakan npm atau Yarn untuk menginstal pustaka dependensi buffer dan lz4:
npm install buffer lz4
Kode contoh:
import lz4 from 'lz4'
import { Buffer } from 'buffer'
// Kompres data.
const data = 'hello world, hello sls'
const output = Buffer.alloc(lz4.encodeBound(data.length))
const compressedSize = lz4.encodeBlock(Buffer.from(data), output)
const compressed = Uint8Array.prototype.slice.call(output, 0, compressedSize)
// Dekompres data.
const bodyRawSize = data.length; // Anda dapat menggunakan parameter x-log-bodyrawsize di header permintaan HTTP yang dikembalikan untuk mendekompres data.
const decompressed = Buffer.alloc(bodyRawSize)
lz4.decodeBlock(Buffer.from(compressed), decompressed)
const result = decompressed.toString()
C++
Salin direktori lz4 dan lib dari direktori root proyek SDK C++ ke direktori tujuan. Saat mengompilasi kode, tambahkan parameter kompilasi serta jalur dan tautan pustaka dependensi lz4. Sebagai contoh, Anda dapat menambahkan jalur -L./lib dan tautan -llz4. Untuk informasi lebih lanjut, lihat Instal Simple Log Service SDK untuk C++:
g++ -o your_progame your_progame.cpp -std=gnu++11 -llz4 -L./lib/
Kode contoh:
#include "lz4/lz4.h"
#include <string>
#include <iostream>
using namespace std;
int main()
{
string data = "hello sls, hello lz4";
// Kompres data.
string compressed;
compressed.resize(LZ4_compressBound(data.size()));
int compressed_size = LZ4_compress(data.c_str(), &compressed[0], data.size());
compressed.resize(compressed_size);
// Dekompres data.
string decompressed;
int bodyRawSize = data.size();
decompressed.resize(bodyRawSize);
LZ4_decompress_safe(compressed.c_str(), &decompressed[0], compressed.size(), bodyRawSize);
cout << decompressed << endl;
return 0;
}