유닉스 도메인 소켓
Go 언어를 활용한 네트워크 프로그래밍 책을 보고 배움
동일한 네트워크 노드 내에서 각기 다른 서비스들이 통신할 수 있도록 함
예를들어 하나의 시스템 환경에서 API 서버와 데이터베이스 어플리케이션을 동시에 구동시킬 때, API에서 통신 대상 경로를
localhost:3306
으로 지정하는 경우도 있지만, 유닉스 도메인 소켓을 통해 통신할 수 도 있음.네트워크 소켓는 IP 주소와 포트 번호로 목적지를 결정하지만, 유닉스 도메인 소켓은 파일 시스템을 이용하여 패킷의 목적지 주소를 결정. 즉 ==파일시스템 내의 특정 파일이 네트워크 소켓의 IP와 포트번호가 하는 역할을 대신 하는 것==
네트워크 스택을 지나지 않기 때문에, 트래픽 라우팅에 대한 오버헤드가 존재하지 않아 효율적 (유닉스 도메인 소켓은 OSI Layer 를 지나지 않음)
패킷 파편화나 패킷 순서를 걱정할 필요가 없음 (OSI Layer를 지나지 않으니)
당연히 노드간 통신에는 사용할 수 없다.
사용
- 파일의 소유권을 가지고 있어야 함
chown seankim /path/to/socket/file
- 660권한 부여해야함
chmod 660 /path/to/socket/file
소켓 타입
타입 | 설명 |
스트리밍소켓 | TCP 처럼 동작 |
데이터그램 소켓 | UDP 처럼 동작 |
시퀀스 패킷 소켓 | 두개 합친느낌 |
예시 (소켓으로 로컬환경의 db와 통신)
func main() {
db, err := sql.Open("mysql", "username:password@unix(/path/to/socket)/database")
if err != nil {
panic(err)
}
defer db.Close()
var count int
err = db.QueryRow("SELECT COUNT(*) FROM users").Scan(&count)
if err != nil {
panic(err)
}
fmt.Println("Number of users:", count)
}
기타
윈도우 OS같은 비 유닉스 환경에서는 사용할 수 없다.