Egloos | Log-in


Simple EDSL for network packet encoding and decoding

최근 Tokyo Tyrant에 감동 받아서 짬짬이 자바 클라이언트를 만들고 있다. 처음에는 MINA로 깔짝 거리다가 비동기 클라이언트 프로그래밍은 적응이 안돼서 집어 치우고 그냥 자바 NIO API로 동기식으로 짜기로 했다. 네트웍 프로그래밍도 오랜만이고 자바 NIO API는 처음이다. 아직은 단순하게 명령만 구현하는 단계라 그리 어렵지 않게 적응하고 있다. 특히 ByteBuffer가 참 편리하더라.

스펙을 보면서 Tokyo Tyrant 명령을 하나 하나 구현하다 보니 당연히 EDSL 입질이 온다. 스펙을 그대로 입력하면 요청 패킷 인코딩, 응답 패킷 디코딩을 자동으로 해주면 좋겠다. 특히 디코딩이 버퍼에 얼마나 남아 있는지 계속 검사해야 하기 때문에 구현하기가 성가시다. 저녁 먹고 회사에 남아서 24 인치 모니터가 다시 두 대가 된 기념으로 열나게 코딩해서 간단한 명령은 스펙을 기술하면 인코딩, 디코딩 되도록 만들었다. 자주 쓰이지 않는 명령은 쉽게 구현하고 자주 써서 성능이 중요한 명령은 손코딩해야 겠다.

예를 보자면 setmst 명령의 스펙은 아래와 같다.

setmst: for the function `tcrdbsetmst'

Request: [magic:2][hsiz:4][port:4][host:*]
Two bytes of the command ID: 0xC8 and 0x78
A 32-bit integer standing for the length of the host name
A 32-bit integer standing for the port number
Arbitrary data of the host name
Response: [code:1]
An 8-bit integer whose value is 0 on success or another on failure


EDSL 구현은

REQUEST = packet(magic(), int32("hsiz"), int32("port"), bytes("host", "hsiz"));
RESPONSE = packet(ecode(false));


stat명령 스펙은

stat: for the function `tcrdbstat'

Request: [magic:2]
Two bytes of the command ID: 0xC8 and 0x88
Response: [code:1][ssiz:4][sbuf:*]
An 8-bit integer whose value is always 0
A 32-bit integer standing for the length of the status message


EDSL 구현은

REQUEST = packet(magic());
RESPONSE = packet(ecode(false), int32("ssiz"), bytes("sbuf", "ssiz"));


Tokyo Tyrant 서버가 memcached 프로토콜도 지원하기 때문에 굳이 자바 클라이언트를 따로 만들 필요는 없다. memcached 클라이언트가 장애 복구나 다중 서버를 잘 지원하기 때문에 웬만큼 만들어서는 memcached 클라이언트 대신 실전에서 사용하기에는 무리다. 일단은 모든 명령 지원이 첫 번째 목표다. 그 다음은 재시도와 자동 재연결, 그 다음은 다중 서버 지원, 그 다음은 master-slave 관계를 고려한 다중 서버 지원을 계획하고 있다.

by 이피 | 2008/10/30 01:22 | Java | 트랙백(1) | 덧글(0)

트랙백 주소 : http://colus.egloos.com/tb/4700547
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from Life is wond.. at 2008/11/14 09:12

제목 : 원격 접근이 가능한 빠르고 간단한 DB가 필요하십니까?
간단하지만 빠르고 신뢰성 있는 데이터 저장소가 필요할 때가 있습니다. 단일 어플리케이션의 경우 QDBM이나 GDBM 등 DBM 시리즈를 많이 썼고, 요즘은 SQLite를 내장하는 추세죠. 하지만 DBM과 SQLite 저장소를 네트웍을 통해 공유해서 쓸 수는 없습니다. DBM은 기능 자체가 없고 SQLite는 동시접속이 많아질 때 문제가 있습니다. 신뢰성도 있어야 하기 때문에 복제도 되었으면 좋겠습니다. 요즘 초대형 웹서비스는 이런 형태의 ......more

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶