shackle
0.6.20
고성능 Erlang 네트워크 클라이언트 프레임워크
- behavior ( shackle_client ).
- export ([
init / 0 ,
setup / 2 ,
handle_request / 2 ,
handle_data / 2 ,
terminate / 1
]).
- record ( state , {
buffer = <<>> :: binary (),
request_counter = 0 :: non_neg_integer ()
}).
- spec init ( Options :: term ()) ->
{ ok , State :: term ()} |
{ error , Reason :: term ()}.
init ( _Options ) ->
{ ok , # state {}}.
- spec setup ( Socket :: inet : socket (), State :: term ()) ->
{ ok , State :: term ()} |
{ error , Reason :: term (), State :: term ()}.
setup ( Socket , State ) ->
case gen_tcp : send ( Socket , << " INIT " >>) of
ok ->
case gen_tcp : recv ( Socket , 0 ) of
{ ok , << " OK " >>} ->
{ ok , State };
{ error , Reason } ->
{ error , Reason , State }
end ;
{ error , Reason } ->
{ error , Reason , State }
end .
- spec handle_request ( Request :: term (), State :: term ()) ->
{ ok , RequestId :: external_request_id (), Data :: iodata (), State :: term ()}.
handle_request ( noop , State ) ->
Data = arithmetic_protocol : request ( 0 , noop , 0 , 0 ),
{ ok , undefined , Data , State };
handle_request ({ Operation , A , B }, # state {
request_counter = RequestCounter
} = State ) ->
RequestId = request_id ( RequestCounter ),
Data = request ( RequestId , Operation , A , B ),
{ ok , RequestId , Data , State # state {
request_counter = RequestCounter + 1
}}.
- spec handle_data ( Data :: binary (), State :: term ()) ->
{ ok , [{ RequestId :: external_request_id (), Reply :: term ()}], State :: term ()}.
handle_data ( Data , # state {
buffer = Buffer
} = State ) ->
Data2 = << Buffer / binary , Data / binary >>,
{ Replies , Buffer2 } = parse_replies ( Data2 , []),
{ ok , Replies , State # state {
buffer = Buffer2
}}.
- spec terminate ( State :: term ()) -> ok .
terminate ( _State ) -> ok .
shackle_pool : start ( shackle_pool : name (), client (), client_options (), pool_options ())
이름 | 유형 | 기본 | 설명 |
---|---|---|---|
주소 | inet:ip_address() | inet:호스트 이름() | "127.0.0.1" | 서버 주소(이전 IP) |
포트 | inet:포트_번호() | 한정되지 않은 | 서버 포트 |
규약 | 족쇄_tcp | 족쇄_udp | 족쇄_ssl | 족쇄_tcp | 서버 프로토콜 |
다시 연결하다 | 부울() | 진실 | 닫힌 연결을 다시 연결 |
reconnect_time_max | pos_integer() | 무한대 | 120000 | 최대 재연결 시간(밀리초) |
reconnect_time_min | 위치정수() | 1000 | 최소 재연결 시간(밀리초) |
소켓_옵션 | [gen_tcp:connect_option() | gen_udp:옵션()] | [] | 소켓에 전달된 옵션 |
이름 | 유형 | 기본 | 설명 |
---|---|---|---|
backlog_size | pos_integer() | 무한대 | 1024 | 연결당 최대 동시 요청 수 |
최대 재시도 횟수 | non_neg_integer() | 3 | 활성 서버를 찾기 위한 최대 시도 횟수 |
pool_size | 위치정수() | 16 | 연결 수 |
풀_전략 | 무작위 | 라운드 로빈 | 무작위의 | 연결 선택 전략 |
1 > shackle : call ( pool_name , { get , << " test " >>}).
{ ok , << " bar " >>}
2 > { ok , ReqId } = shackle : cast ( pool_name , { get , << " foo " >>}, 500 ).
{ ok , { anchor , anchor_client , # Ref < 0.0 . 0.2407 > }}
3 > shackle : receive_response ( ReqId ).
{ ok , << " bar " >>}
Shackle은 백엔드에 구애받지 않는 원격 측정 라이브러리와 통합됩니다. Shackle이 내보낼 수 있는 원격 측정 이벤트 목록은 shackle_telemetry
참조하세요.
make dialyzer
make eunit
make xref
성능 테스트 대상을 실행하려면 먼저 서버를 시작해야 합니다.
./bin/server.sh
그런 다음 bench
또는 profile
대상을 실행할 수 있습니다.
make bench
make profile
이름 | 설명 |
---|---|
닻 | Memcached 클라이언트 |
아스피크 노드 | 에어로스파이크 클라이언트 |
부표 | HTTP 1.1 클라이언트 |
플레어 | 카프카 프로듀서 |
선착장 | 카산드라 CQL 클라이언트 |
통계 | 통계D 클라이언트 |
The MIT License (MIT)
Copyright (c) 2015-2023 Louis-Philippe Gauthier
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.