For internal services that need to have successful service request sends (i.e., a timeout does not occur because a response is received within the timeout period) with each send done asynchronously and all tracking done with in-memory data.
.Copyright © 2015-2018 Michael Truog
Version: 1.7.3 Feb 26 2018 17:29:20 ------------------------------------------------------------------------
Authors: Michael Truog (mjtruog [at] gmail (dot) com).
For internal services that need to have successful service request sends (i.e., a timeout does not occur because a response is received within the timeout period) with each send done asynchronously and all tracking done with in-memory data.
The data is not queued within this module's internal data structure, but like all service requests, the queueing occurs in the destination service process. This module's internal data provides tracking based on the service request transaction id so many asynchronous service requests may be easily managed concurrently. The alternative is to rely on synchronous service requests and increase the sending service's process count as necessary for concurrency, which is a simpler approach. So, cloudi_queue usage is necessary when multiple service requests must be sent concurrently and every request must receive a response (receiving a response is the only proof the transaction was successful).
Only one instance of cloudi_queue is necessary within a service's state due to the transaction id being globally unique.options() = [{retry, non_neg_integer()} | {retry_delay, non_neg_integer()} | {ordered, boolean()} | {validate_request_info, fun((RequestInfo::cloudi_service:request_info()) -> boolean()) | {Module1::module(), Function1::atom()}} | {validate_request, fun((RequestInfo::cloudi_service:request_info(), Request::cloudi_service:request()) -> boolean()) | {Module2::module(), Function2::atom()}} | {validate_response_info, fun((ResponseInfo::cloudi_service:response_info()) -> boolean()) | {Module3::module(), Function3::atom()}} | {validate_response, fun((ResponseInfo::cloudi_service:response_info(), Response::cloudi_service:response()) -> boolean()) | {Module4::module(), Function4::atom()}} | {failures_source_die, boolean()} | {failures_source_max_count, pos_integer()} | {failures_source_max_period, infinity | pos_integer()}]
ordered_requests() = queue:queue(#request_ordered_send{name = cloudi_service:service_name(), request_info = cloudi_service:request_info(), request = cloudi_service:request(), timeout = cloudi_service:timeout_milliseconds(), priority = cloudi_service:priority(), id = cloudi_service:trans_id(), pattern_pid = cloudi_service:pattern_pid() | undefined} | #request_ordered_mcast{name = cloudi_service:service_name(), request_info = cloudi_service:request_info(), request = cloudi_service:request(), timeout = cloudi_service:timeout_milliseconds(), priority = cloudi_service:priority()})
requests() = #{cloudi_service:trans_id() := #request{name = cloudi_service:service_name(), request_info = cloudi_service:request_info(), request = cloudi_service:request(), timeout = cloudi_service:timeout_milliseconds(), priority = cloudi_service:priority(), id = cloudi_service:trans_id(), pattern_pid = cloudi_service:pattern_pid(), retry_pattern_pid = boolean(), retry_count = non_neg_integer(), retry_delay = boolean()}}
state() = #cloudi_queue{retry = non_neg_integer(), retry_delay = non_neg_integer(), ordered = boolean(), word_size = pos_integer(), service = undefined | pid(), validate_request_info = undefined | fun((any()) -> boolean()), validate_request = undefined | fun((any(), any()) -> boolean()), validate_response_info = undefined | fun((any()) -> boolean()), validate_response = undefined | fun((any(), any()) -> boolean()), failures_source_die = boolean(), failures_source_max_count = pos_integer(), failures_source_max_period = infinity | pos_integer(), failures_source = [cloudi_timestamp:seconds_monotonic()], ordered_requests = ordered_requests(), ordered_pending = non_neg_integer(), requests = requests()}
byte_size(Dispatcher::cloudi_service:dispatcher(), State::state()) -> non_neg_integer()
byte_size(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), State::state()) -> non_neg_integer()
byte_size(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), State::state()) -> non_neg_integer()
byte_size(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), PatternPid::cloudi_service:pattern_pid() | undefined, State::state()) -> non_neg_integer()
byte_size(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), RequestInfo::cloudi_service:request_info(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), Priority::cloudi_service:priority(), State::state()) -> non_neg_integer()
byte_size(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), RequestInfo::cloudi_service:request_info(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), Priority::cloudi_service:priority(), PatternPid::cloudi_service:pattern_pid() | undefined, State::state()) -> non_neg_integer()
failures(Dispatcher::cloudi_service:dispatcher(), State::state()) -> non_neg_integer()
handle_info(Return_async_active::any(), State::state(), Dispatcher::cloudi_service:dispatcher()) -> {ok, StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()} | {ignored, State::state()}
cloudi_service_handle_info/3
callback function.
mcast(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), State::state()) -> {ok, State::state()} | {{error, Reason::cloudi_service:error_reason()}, State::state()}
mcast(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), State::state()) -> {ok, State::state()} | {{error, Reason::cloudi_service:error_reason()}, State::state()}
mcast(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), RequestInfo::cloudi_service:request_info(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), Priority::cloudi_service:priority(), State::state()) -> {ok, State::state()} | {{error, Reason::cloudi_service:error_reason()}, State::state()}
new() -> state()
recv(Dispatcher::cloudi_service:dispatcher(), ReturnAsync::#return_async_active{name = cloudi_service:service_name(), pattern = cloudi_service:service_name_pattern(), response_info = cloudi_service:response_info(), response = cloudi_service:response(), timeout = cloudi_service:timeout_value_milliseconds(), trans_id = cloudi_service:trans_id()}, State::state()) -> {ok, StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()} | {ignored, State::state()}
cloudi_service_handle_info/3
callback function.
recv_id(Dispatcher::cloudi_service:dispatcher(), Return_async_active::#return_async_active{name = cloudi_service:service_name(), pattern = cloudi_service:service_name_pattern(), response_info = cloudi_service:response_info(), response = cloudi_service:response(), timeout = cloudi_service:timeout_value_milliseconds(), trans_id = cloudi_service:trans_id()}, State::state()) -> {ok, Id::cloudi_service:trans_id(), StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()} | {ignored, State::state()}
cloudi_service_handle_info/3
callback function.
send(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), State::state()) -> {ok, StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()}
send(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), State::state()) -> {ok, StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()}
send(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), PatternPid::cloudi_service:pattern_pid() | undefined, State::state()) -> {ok, StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()}
send(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), RequestInfo::cloudi_service:request_info(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), Priority::cloudi_service:priority(), State::state()) -> {ok, StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()}
send(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), RequestInfo::cloudi_service:request_info(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), Priority::cloudi_service:priority(), PatternPid::cloudi_service:pattern_pid() | undefined, State::state()) -> {ok, StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()}
send_id(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), State::state()) -> {ok, Id::cloudi_service:trans_id(), StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()}
send_id(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), State::state()) -> {ok, Id::cloudi_service:trans_id(), StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()}
send_id(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), PatternPid::cloudi_service:pattern_pid() | undefined, State::state()) -> {ok, Id::cloudi_service:trans_id(), StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()}
send_id(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), RequestInfo::cloudi_service:request_info(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), Priority::cloudi_service:priority(), State::state()) -> {ok, Id::cloudi_service:trans_id(), StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()}
send_id(Dispatcher::cloudi_service:dispatcher(), Name::cloudi_service:service_name(), RequestInfo::cloudi_service:request_info(), Request::cloudi_service:request(), Timeout::cloudi_service:timeout_milliseconds(), Priority::cloudi_service:priority(), PatternPid::cloudi_service:pattern_pid() | undefined, State::state()) -> {ok, Id::cloudi_service:trans_id(), StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()}
size(Dispatcher::cloudi_service:dispatcher(), State::state()) -> non_neg_integer()
timeout(Dispatcher::cloudi_service:dispatcher(), TimeoutAsync::#timeout_async_active{trans_id = cloudi_service:trans_id()}, State::state()) -> {ok, StateNew::state()} | {{error, Reason::cloudi_service:error_reason()}, StateNew::state()} | {ignored, State::state()}
ok
is returned if a service request is retried. Must be called from the
cloudi_service_handle_info/3
callback function.
Generated by EDoc, Feb 26 2018, 17:29:20.