Using socket module in production?
pablo platt
pablo.platt@REDACTED
Sun Jun 21 23:56:02 CEST 2020
I have used the socket module for udp sockets in production. I had hundreds
of sockets at the same time receiving 5K packets/second and sending 25K
packets/second.
I didn't encounter errors and didn't get bug reports from users. Seems to
be very stable.
But I also didn't see any performance improvement compared to gen_udp.
I'm using socket:recvfrom(Socket, 0, [], nowait) and socket:sendto(Socket,
Data, Dest, [], nowait).
Shouldn't I gain some performance over gen_udp?
On Fri, Jun 12, 2020 at 7:31 PM Vans S <vans_163@REDACTED> wrote:
> We notice often using gen_tcp with sockets backend we get this warning
> printed:
>
> 3:24:4.923 <0.1018.0> [module: :gen_tcp_socket, socket: {:"$socket",
> #Reference<0.504347063.3068526593.55942>}, unknown_event: {:info,
> {:"$socket", {:"$socket", #Reference<0.504347063.3068526593.55942>},
> :select, #Reference<0.504347063.3083599875.167918>}}, state: :connected]
>
> Ignore the log format this is our custom format.
>
> Seems to be some kinda race condition in the implementation.
>
> On Friday, June 12, 2020, 09:30:07 a.m. EDT, pablo platt <
> pablo.platt@REDACTED> wrote:
>
>
> Hi Raimo,
>
> I don't mind small changes in the API if changes will be indicated in the
> release notes.
> But I worry about other breaking changes or hidden bugs.
> If anyone from the community is already using it in production it will be
> reassuring.
>
> Thank you.
>
> On Fri, Jun 12, 2020 at 4:00 PM Raimo Niskanen <
> raimo+erlang-questions@REDACTED> wrote:
>
> Hi Pablo!
>
> We will still make backwards incompatible changes. But we do not know of
> any stability issues, and welcome all that stress test the code.
>
> So your code might stop working work in a future 23.X release.
>
> / Raimo
>
>
> On Fri, Jun 12, 2020 at 01:48:32PM +0300, pablo platt wrote:
> > Hi,
> >
> > Is it safe to use the NIF socket module for UDP in production in OTP 23?
> > It's working in my tests but I'm not sure if it's considered unstable or
> if
> > I'm missing configuration or error handling.
> >
> > This is how I'm using it:
> >
> > open() ->
> > {ok, Socket} = socket:open(inet, dgram, udp),
> > {ok, Port} = socket:bind(Socket, any),
> > {Socket, Port}.
> >
> > active_once(Socket) ->
> > case socket:recvfrom(Socket, 0, [], nowait) of
> > {ok, {#{port := Port, addr := Addr}, Data}} ->
> > {udp, Addr, Port, Data};
> > {select, {select_info, _SelectTag, SelectRef}} ->
> > SelectRef;
> > {error, Reason} ->
> > exit(Reason),
> > error
> > end.
> >
> > send(Socket, Addr, Port, Data) ->
> > Dest = #{family => inet,
> > port => Port,
> > addr => Addr},
> > case socket:sendto(Socket, Data, Dest, [], nowait) of
> > ok -> ok;
> > {select, {select_info, _SelectTag, _SelectRef}} ->
> > % need to wait for {'$socket', Socket, select, SelectRef}
> and
> > resend Data?
> > ok
> > end.
> >
> > close(Socket) ->
> > socket:close(Socket).
> >
> > % listen for select ref
> > handle_info({'$socket', Socket, select, SelectRef}, _State) ->
> > case socket:recvfrom(Socket, 0, [], nowait) of
> > {ok, {#{port := Port, addr := Addr}, Data}} ->
> > % handle Data
> > ok;
> > {select, {select_info, _SelectTag, SelectRef}} ->
> > SelectRef;
> > {error, Reason} ->
> > exit(Reason),
> > error
> > end,
> > {noreply, State}.
>
> --
>
> / Raimo Niskanen, Erlang/OTP, Ericsson AB
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20200622/e15f13e9/attachment.htm>
More information about the erlang-questions
mailing list