HTTP 멱 등 성
Todd.log - a place to keep my thoughts on programming
HTTP 멱 등 성 이해
HTTP 프로 토 콜 을 기반 으로 한 웹 API 는 현재 가장 유행 하 는 분포 식 서비스 제공 방식 이다.대형 인터넷 애플 리 케 이 션 이 든 기업 급 구조 든 우 리 는 점점 더 많은 SOA 나 RESTful 의 웹 API 를 만 났 다.왜 웹 API 가 이렇게 유행 합 니까?간단 하고 효과 적 인 HTTP 프로 토 콜 덕분 이 라 고 생각 합 니 다.HTTP 프로 토 콜 은 분포 식 자원 을 대상 으로 하 는 네트워크 응용 층 프로 토 콜 로 서버 에서 웹 서 비 스 를 제공 하 든 클 라 이언 트 가 웹 서 비 스 를 소비 하 든 매우 간단 하 다.게다가 브 라 우 저,자 바스 크 립 트,AJAX,JSON,HTML 5 등 기술 과 도구 의 발전 으로 인터넷 응용 구조 디자인 은 전통 적 인 PHP,JSP,ASP.NET 등 서버 측 동적 웹 페이지 에서 웹 API+RIA(부 인터넷 응용)로 과도 하 는 추 세 를 보 였 다.웹 API 는 업무 서 비 스 를 제공 하 는 데 전념 하고 RIA 는 사용자 인터페이스 와 상호작용 디자인 에 전념 하여 이 두 분야 의 분업 이 더욱 명확 해 졌 다.이런 추세 에서 웹 API 디자인 은 서버 엔 드 프로그래머 의 필수 과목 이 될 것 이다.그러나 간단 한 자바 언어 가 고 품질의 자바 프로그램 을 의미 하지 않 는 것 처럼 간단 한 HTTP 프로 토 콜 도 고 품질의 웹 API 를 의미 하지 않 는 다.고 품질의 웹 API 를 설계 하려 면 분포 식 시스템 과 HTTP 프로 토 콜 의 특성 을 깊이 이해 해 야 한다.
멱 등 성 정의
본 고 에서 연구 하고 자 하 는 것 은 바로 HTTP 프로 토 콜 이 관련 된 중요 한 성질 인 멱 등 성(Idempotence)이다.HTTP/1.1 규범 에서 멱 등의 정 의 는:
Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
정의 상 HTTP 방법의 멱 등 성 은 한 번 과 여러 번 어떤 자원 을 요청 할 때 같은 부작용 을 가 져 야 한 다 는 것 을 말한다.幂 등 성 은 어의의 범주 에 속한다.컴 파 일 러 가 문법 오 류 를 검사 하 는 데 만 도움 을 줄 수 있 듯 이 HTTP 규범 도 메시지 형식 등 문법 수단 을 통 해 그것 을 정의 할 수 없다.이것 은 이것 이 그다지 중시 되 지 않 는 원인 중 하나 일 수 있다.그러나 실제 적 으로 멱 등 성 은 분포 식 시스템 디자인 에서 매우 중요 한 개념 이 고 HTTP 의 분포 식 본질 도 HTTP 에서 중요 한 위 치 를 결정 한다.
분산 트 랜 잭 션 vs 미터 등 디자인
왜 멱 등 성 이 필요 합 니까?우 리 는 먼저 하나의 예 에서 말 하면 계좌 에서 돈 을 찾 는 원 격 API(HTTP 일 수도 있 고 아 닐 수도 있다)가 있다 고 가정 합 니 다.우 리 는 잠시 클래스 함수 로 기록 합 니 다.
bool withdraw(account_id, amount)
withdraw 의 의 미 는 accountid 에 대응 하 는 계좌 에서 amount 금액 의 돈 을 공제 합 니 다.공제 에 성공 하면 true 로 돌아 가 계 정 잔액 이 amount 감소 합 니 다.공제 에 실패 하면 false 로 돌아 가 계 정 잔액 은 변 하지 않 습 니 다.주의해 야 할 것 은 현지 환경 에 비해 우 리 는 분포 식 환경의 신뢰성 을 쉽게 가설 할 수 없다 는 것 이다.전형 적 인 상황 은 withdraw 요청 이 서버 측 에 의 해 정확하게 처리 되 었 으 나 서버 측의 반환 결 과 는 네트워크 등 으로 인해 잃 어 버 려 서 클 라 이언 트 가 처리 결 과 를 알 수 없 게 되 었 다 는 것 이다.만약 에 홈 페이지 에 있 으 면 일부 부적 절 한 디자인 은 사용자 로 하여 금 지난번 조작 이 실패했다 고 생각 하 게 하고 페이지 를 새로 고침 하 게 할 수 있 습 니 다.이 로 인해 withdraw 는 두 번 호출 되 었 고 계 정 도 한 번 더 공제 되 었 습 니 다.그림 1 참조:
그림 1
이 문제 의 해결 방안 은 분포 식 사 무 를 이용 하여 분포 식 사 무 를 지원 하 는 중간 부품 을 도입 하여 withdraw 기능 의 사무 성 을 확보 하 는 것 이다.분산 식 업무 의 장점 은 호출 자 에 게 간단 하고 복잡성 은 모두 미들웨어 에 맡 겨 관리 하 는 것 이다.단점 은 한편 으로 는 구조 가 너무 중량급 이 고 특정한 중간 부품 에 묶 이기 쉬 우 며 이 구조 시스템 의 집적 에 불리 하 다 는 것 이다.다른 한편,분포 식 사 무 는 업무 의 ACID 성질 을 보장 할 수 있 지만 성능 과 가용성 을 보장 할 수 없다.
또 다른 경량급 의 해결 방안 은 멱 등 설계 이다.우 리 는 몇 가지 기 교 를 통 해 withdraw 를 멱 등 으로 바 꿀 수 있다.예 를 들 어:
int create_ticket()
bool idempotent_withdraw(ticket_id, account_id, amount)
create_ticket 의 의 미 는 서버 에서 생 성 된 유일한 처리 번 호 를 가 져 오 는 ticketid,이것 은 표지 의 후속 작업 에 사 용 될 것 입 니 다.idempotent_withdraw 와 withdraw 의 차 이 는 하나의 ticket 과 연 결 된 것 입 니 다.id,하나의 ticketid 가 표시 하 는 동작 은 기껏해야 한 번 만 처리 되 고 매번 호출 할 때마다 첫 번 째 호출 시의 처리 결 과 를 되 돌려 줍 니 다.이렇게,idempotentwithdraw 는 멱 등에 부합 되 므 로 클 라 이언 트 는 안심 하고 여러 번 호출 할 수 있 습 니 다.
멱 등 성 을 바탕 으로 하 는 해결 방안 중 하나의 완전한 인출 절 차 는 두 단계 로 분해 되 었 다.1.create 호출ticket()티켓 획득id;2.idempotent 호출withdraw(ticket_id, account_id, amount)。비록 createticket 은 미터 가 아 닙 니 다.그러나 이러한 디자인 에서 시스템 상태 에 미 치 는 영향 은 무시 할 수 있 습 니 다.게다가 idempotentwithdraw 는 멱 등 이기 때문에 네트워크 등 으로 인해 실패 하거나 시간 을 초과 하면 클 라 이언 트 는 결 과 를 얻 을 때 까지 다시 시도 할 수 있 습 니 다.그림 2 참조:
그림 2
분포 식 사무 에 비해 멱 등 디자인 의 장점 은 경량급 으로 이 구조 환경 에 쉽게 적응 하고 성능 과 가용성 에 있다.어떤 성능 은 비교적 높 은 응용 을 요구 하 는데,멱 등 디자인 은 왕왕 유일한 선택 이다.
HTTP 의 멱 등 성
HTTP 프로 토 콜 자 체 는 자원 을 대상 으로 하 는 응용 층 프로 토 콜 이지 만 HTTP 프로 토 콜 의 사용 에 대해 실제 적 으로 두 가지 다른 방식 이 존재 한다.하 나 는 RESTful 이 고 HTTP 를 응용 층 프로 토 콜 로 생각 하 며 HTTP 프로 토 콜 의 각종 규정 을 비교적 충 실 히 지 켰 다.다른 하 나 는 SOA 의 것 으로 HTTP 를 응용 층 프로 토 콜 로 완전히 생각 하지 않 고 HTTP 프로 토 콜 을 전송 층 프로 토 콜 로 한 다음 에 HTTP 위 에 자신의 응용 층 프로 토 콜 을 만 들 었 다.본 고 에서 논의 한 HTTP 멱 등 성 은 주로 RESTful 스타일 을 대상 으로 하지만 지난 절 에서 보 듯 이 멱 등 성 은 특정한 협의 에 속 하지 않 고 분포 식 시스템 의 특성 이다.따라서 SOA 든 RESTful 이 든 웹 API 디자인 은 멱 등 성 을 고려 해 야 한다.다음은 HTTP GET,DELETE,PUT,POST 네 가지 주요 방법의 의미 와 멱 등 성 을 소개 한다.
HTTP GET 방법 은 자원 을 얻 는 데 사용 되 며 부작용 이 없 기 때문에 멱 등 입 니 다.GEThttp://www.bank.com/account/123456자원 의 상 태 를 바 꾸 지 않 습 니 다.한 번 호출 하 든 N 번 호출 하 든 부작용 이 없습니다.여기 서 강조 하 는 것 은 매번 GET 의 결과 가 동일 한 것 이 아니 라 한 번 과 N 번 이 같은 부작용 을 가 진 다 는 점 이다.GET http://www.news.com/latest-news이 HTTP 요청 은 매번 다른 결 과 를 얻 을 수 있 지만,그 자체 가 부작용 을 일 으 키 지 않 아 멱 등 을 만족 시 킬 수 있 습 니 다.
HTTP DELETE 방법 은 자원 을 삭제 하 는 데 사용 되 며 부작용 이 있 지만 멱 등 성 을 만족 시 켜 야 합 니 다.DELETEhttp://www.forum.com/article/4231한 번 호출 과 N 번 호출 이 시스템 에 미 치 는 부작용 은 같 습 니 다.즉,id 가 4231 인 게시 물 을 삭제 하 는 것 입 니 다.따라서 호출 자 는 오 류 를 걱정 하지 않 고 페이지 를 여러 번 호출 하거나 새로 고 칠 수 있다.
헷 갈 리 기 쉬 운 것 은 HTTP POST 와 PUT 다.POST 와 PUT 의 차 이 는'POST 는 자원 을 만 드 는 것 을 나타 내 고 PUT 는 자원 을 업데이트 하 는 것 을 나타 낸다'고 간단하게 오인 되 기 쉽다.실제로 이들 은 모두 자원 을 만 드 는 데 사용 할 수 있 고 더욱 본질 적 인 차 이 는 멱 등 성에 있다.HTTP 규범 에서 POST 와 PUT 에 대해 다음 과 같이 정의 합 니 다.
The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line ...... If a resource has been created on the origin server, the response SHOULD be 201 (Created) and contain an entity which describes the status of the request and refers to the new resource, and a Location header.
The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.
POST 에 대응 하 는 URI 는 생 성 된 자원 자체 가 아니 라 자원 의 수신 자 입 니 다.POSThttp://www.forum.com/articles네,맛 없어 요.http://www.forum.com/articles다음 게시 물 을 만 듭 니 다.HTTP 응답 에는 게시 물의 생 성 상태 와 게시 물의 URI 가 포함 되 어야 합 니 다.두 번 의 같은 POST 요청 은 서버 에 두 개의 자원 을 만 들 것 입 니 다.서로 다른 URI 를 가지 고 있 습 니 다.그래서 POST 방법 은 멱 등 성 을 갖 추 지 못 한다.PUT 에 대응 하 는 URI 는 자원 자 체 를 만 들 거나 업데이트 하 는 것 입 니 다.PUThttp://www.forum/articles/4231ID 가 4231 인 게시 물 을 만 들 거나 업데이트 하 는 것 을 의미 합 니 다.같은 URI 에 여러 번 PUT 를 하 는 부작용 은 한 번 PUT 와 같다.따라서 PUT 방법 은 멱 등 성 을 가지 고 있다.
몇 가지 조작의 의미 와 멱 등 성 을 소개 한 후에 웹 API 형식 을 통 해 앞에서 언급 한 인출 기능 을 어떻게 실현 하 는 지 살 펴 보 자.간단 합 니 다.POST/tickets 로 create 를 실현 합 니 다.ticket;PUT/acounts/acount 로id/ticket_id&amount=xxx 로 idempotent 실현withdraw。주의해 야 할 것 은 엄 밀 히 말 하면 amount 매개 변 수 는 URI 의 일부분 이 되 어 서 는 안 되 고 진정한 URI 는/acounts/acountid/ticket_id,amount 는 요청 한 body 에 넣 어야 합 니 다.이런 모델 은 많은 장소 에 응용 할 수 있다.예 를 들 어 포럼 사이트 에서 의외 의 중복 게시 물 을 방지 할 수 있다.
총결산
위 에 서 는 분포 식 사 무 를 멱 등 으로 대체 하 는 방법 과 HTTP 주요 방법의 의미 와 멱 등 특징 을 간단하게 소개 했다.사실 근원 을 추적 하려 면 멱 등 성 은 수학의 한 개념 으로 N 차 변환 이 1 차 변환 과 같은 결 과 를 나타 내 며 관심 있 는 독자 들 은 위 키 백과 에서 더 알 수 있다.
레 퍼 런 스
RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1, Method DefinitionsThe Importance of IdempotenceStackoverflow - PUT vs POST in REST
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
빠른 팁: SingleStoreDB의 데이터 API 사용SingleStoreDB는 HTTP 연결을 통해 SQL 문을 실행하는 데 사용할 수 있는 을 제공합니다. 이 짧은 문서에서는 이 데이터 API를 사용하는 방법에 대한 예를 보여줍니다. A는 무료 SingleStore...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.