최근 프로젝트 업데이트 회의에서 우리 팀은 직렬화를 사용하여 이 애플리케이션에서 데이터를 주고받는 방법에 대해 이야기했습니다.
소프트웨어 프로젝트에 더 관심을 갖고 있던 엔지니어는 이 용어가 낯설다고 말했습니다.
보다 광범위한 프로젝트에 뛰어들 때까지 이러한 필수 프로세스를 놓치기 쉽습니다. 이 사람에게도 그랬고, 어느 순간 나에게도 그랬다.
그래서 그것에 대해 쓰고 싶었습니다. 저는 그날 동료가 직렬화에 대해 배울 수 있도록 도왔습니다. 여러분은 오늘 그것에 대해 배우게 될 것입니다.
직렬화란 무엇입니까?
직렬화는 한 서비스가 Python의 사전과 같은 데이터 구조를 가져와 랩핑한 다음 다른 서비스로 전송하여 읽는 프로세스입니다. 간단한 정의입니다.
누군가에게 메시지를 보내야 한다고 상상해보십시오. 그래서 나는 이미 조립 된 퍼즐에 텍스트를 씁니다. 나는 조각을 분해하고 퍼즐을 다시 조립하는 방법에 대한 지침을 추가하고 함께 보냅니다.
그런 다음 메시지 수신자는 퍼즐 조각을 가져와서 모두 다시 결합하고 이제 내 메시지를 갖게 됩니다.
기술적인 정의가 좀 더 재미있습니다. 즉, 직렬화는 데이터 개체를 바이트 스트림으로 변환하고 개체의 상태를 디스크에 저장하거나 네트워크를 통해 전송하는 과정입니다. 이렇게 하면 필요한 저장 공간이 줄어들고 네트워크를 통해 정보를 더 쉽게 전송할 수 있습니다.
마샬링과 직렬화 - 차이점은 무엇입니까?
마샬링 프로세스가 떠오를 수 있습니다. 마샬링은 개체의 메모리 표현을 전송에 적합한 형식으로 변환하는 프로세스입니다.
마샬링 및 직렬화가 느슨하게 동의어, 결정적인 차이가 있습니다. 예를 들어 JSON 데이터를 Golang 데이터 구조로 읽는 Golang 프로그램을 만들 때 마샬링을 사용하여 JSON 키 값을 Golang 키 값으로 변환할 수 있습니다.
차이점은 마샬링을 사용하여 데이터를 변환할 수 있다는 것입니다. 대조적으로 직렬화는 데이터를 바이트 스트림으로 보내거나 저장하고 원래 형식으로 재조립합니다. 둘 다 직렬화를 수행하지만 이 두 프로세스에서 의도에 차이가 있습니다.
아래에서 Twitter 데이터와 상호 작용하기 위해 만든 이 구조체를 작동 마샬링의 예로 볼 수 있습니다. Golang에서는 태그라는 힌트를 제공하여 Golang의 내장 마샬링 서비스를 사용하여 이 개체를 JSON 데이터로 쉽게 변환할 수 있습니다.
엔디안이란 무엇입니까?
엔디안이라는 주제도 가볍게 다루고 싶습니다. 엔디안은 메모리의 바이트 순서를 설명하는 데 사용되는 용어입니다.
메모리는 데이터 비트가 저장되는 블록으로 생각할 수 있습니다. 직렬화가 작동하려면 바이트 스트림이 한 시스템에서 다른 시스템으로 엔디안 변경에 관계없이 데이터 유형을 전송해야 합니다.
아래에서 리틀 엔디안과 빅 엔디안의 차이점을 확인할 수 있습니다. 모든 시스템이 같은 방식으로 비트를 주문하는 것은 아니므로 엔디안이 한 시스템에서 다른 시스템으로 일치하거나 어떻게든 변환되어야 합니다.
직렬화 사용 사례
우리의 사용 사례는 이러한 기능을 최대한 활용합니다. 우리는 스캔 중인 하드웨어에서 일부 정보를 가져와서 해당 정보를 바이트 스트림으로 패키징하고 네트워크와 함께 데이터를 재구성할 다른 서비스로 보낼 계획입니다.
직렬화 프로세스를 역전시키고 데이터를 다시 원래 형태로 재구성하는 프로세스를 역직렬화라고 합니다. .
이에 대한 다른 사용 사례가 있습니다. 예를 들어 REST API 또는 AMQP와 같은 메시징 프로토콜은 직렬화를 사용하여 데이터를 압축하고 보낼 수 있습니다.
AMQP는 메시지를 AMQP 브로커에 보내는 메시징 프로토콜이며 수신 서비스는 메시지에 대해 이 브로커를 "수신"합니다. 백엔드 엔지니어는 이것을 잘 알고 있을 것입니다. 이는 분산 시스템 내에서 데이터를 주고받는 데 자주 사용되기 때문입니다.
많은 프로그래밍 언어에는 일부 직렬화를 쉽게 스핀업할 수 있는 기능이 포함되어 있습니다. 따라서 언어에 구애받지 않는 주제입니다.
직렬화 예
간단한 예를 들어보겠습니다. 이 코드는 라이브러리 kombu를 사용하여 AMQP를 통해 메시지를 보냅니다. 우리는 이것을 사용하여 네트워크를 통해 한 소프트웨어 패키지에서 다른 소프트웨어 패키지로 메시지를 보냅니다. 이 코드는 AMQP 브로커에게 메시지를 보내는 서비스를 위한 것입니다.
def send_message(self, payload, sender_serializer):
...
try:
producer.publish(
{'payload': message},
...
serializer = 'json',
...
)
return
publish
을 기록해 두십시오. 방법. 라이브러리가 전달하는 데이터를 직렬화하는 방법을 알 수 있도록 직렬화 메소드를 인수로 전달합니다.
데이터 메시지는 바이트 스트림으로 변환됩니다. 이 스트림은 문자와 숫자의 긴 문자열처럼 보입니다. 우리는 메시지를 보냅니다.
해당 서비스는 동일한 직렬화 방법을 사용하여 데이터를 원래 상태로 재구성합니다. 이는 작업을 위해 서로에게 메시지를 보낼 수 있어야 하는 도구 모음을 만들고 있기 때문에 중요한 기능입니다.
직렬화 데이터 형식
당면한 작업에서 직렬화를 요청할 때마다 JSON을 직렬화에 사용합니다. 그러나 몇 가지 다른 것을 사용할 수도 있습니다.
JSON에는 많은 오버헤드가 있지만 사람이 가독성을 높여 나에게 이상적입니다. Protobufs, YAML 또는 XML을 사용할 수도 있습니다. 이것들은 사용할 수 있는 데이터 개체 형식의 일부일 뿐입니다.
결론
내 시스템에서 이것을 가져 와서 기쁩니다. 나는 이것에 대해 생각하는 것을 그만둬야 했고, 바라건대 누군가가 이것으로부터 무언가를 배웠습니다.
통신 파이프라인을 구성할 때 직렬화가 필수적입니다. 적절한 배경 지식을 가지고 사용하는 도구에 자신감을 가지려면 이 주제에 대해 아는 것이 좋습니다.
-조지