Closed json2008 closed 1 year ago
@fahchen
请抽空过一下这个,看是否合适?
关于 gen_message 我觉得不合适,因为系统级别的用 gen 比较合适(比如 gen_server,gen_event, gen_statem,gentcp 等),这里只是 wal 的 message,所以用 gen 不合适。
behaviour 还是用 Message 比较合适
这样呢
PostgrexWal.Message
: behaviourPostgrexWal.Message.{Begin, Commit}
: message modulesPostgrexWal.Message.Util
,不是消息的就放到 PostgrexWal.Util
里面有2个小问题:
PostgrexWal.Message
, PostgrexWal.Message.Message
?,感觉有点混淆、凌乱?会有2个 Message
模块存在。(嵌套层级不同)PostgrexWal.Message.Util
, PostgrexWal.Util
,这两个模块,一旦做alias
后,都是Util
,调用其中的函数时,不易区分是那个模块里的? defp decode_wal(<<key::8, _rest::binary>> = payload, state) do
alias PostgrexWal.Messages.Util
# alternative 1
in_stream? =
cond do
Util.stream_start?(key) ->
state.in_stream? && Logger.error("stream flag consecutively true")
true
Util.stream_stop?(key) ->
state.in_stream? || Logger.error("stream flag consecutively false")
false
true ->
state.in_stream?
end
# alternative 2
in_stream? =
case key do
StreamStart.identifier() ->
state.in_stream? && Logger.error("stream flag consecutively true")
true
StreamStop.identifier() ->
state.in_stream? || Logger.error("stream flag consecutively false")
false
_ ->
state.in_stream?
end
payload =
if in_stream? and Util.streamable?(key),
do: {:in_stream, payload},
else: payload
{Util.decode(payload), %{state | in_stream?: in_stream?}}
end
end
stream_start/1
, stream_stop/1
,这两个函数仅在这个地方用一次?认知
,应该仅限于PgSource
模块内部。不扩散。(那么就应该是:alternative 2
)Message
模块,自身带有identifier/0
,那基于同样的理由,就应该也自带有:streamable?/0
,以表示其是否能在stream
中出现?(但是从此代码片段中,可看出,实现有点困难,是先有鸡,还是先有蛋的问题?或是带来复杂度)。有2个小问题:
- 会存在
PostgrexWal.Message
,PostgrexWal.Message.Message
?,感觉有点混淆、凌乱?会有2个Message
模块存在。(嵌套层级不同)PostgrexWal.Message.Util
,PostgrexWal.Util
,这两个模块,一旦做alias
后,都是Util
,调用其中的函数时,不易区分是那个模块里的?
PostgrexWal.Message.Message
,只会有 PostgrexWal.Message
PostgrexWal.Util
,如果其他地方同时使用 PostgrexWal.Util
和 PostgrexWal.Message.Util
这两个,可以用 alias```elixir defp decode_wal(<<key::8, _rest::binary>> = payload, state) do alias PostgrexWal.Messages.Util # alternative 1 in_stream? = cond do Util.stream_start?(key) -> state.in_stream? && Logger.error("stream flag consecutively true") true Util.stream_stop?(key) -> state.in_stream? || Logger.error("stream flag consecutively false") false true -> state.in_stream? end # alternative 2 in_stream? = case key do StreamStart.identifier() -> state.in_stream? && Logger.error("stream flag consecutively true") true StreamStop.identifier() -> state.in_stream? || Logger.error("stream flag consecutively false") false _ -> state.in_stream? end payload = if in_stream? and Util.streamable?(key), do: {:in_stream, payload}, else: payload {Util.decode(payload), %{state | in_stream?: in_stream?}} end end
stream_start/1, stream_stop/1,这两个函数仅在这个地方用一次? stream是否开始?是否结束?这样的认知,应该仅限于PgSource模块内部。不扩散。(那么就应该是:alternative 2) 如果每个Message模块,自身带有identifier/0,那基于同样的理由,就应该也自带有:streamable?/0,以表示其是否能在stream中出现?(但是从此代码片段中,可看出,实现有点困难,是先有鸡,还是先有蛋的问题?或是带来复杂度)。
alternative 2
更合适一些streamable?/0
我觉得不用放到单个 message 里面,可以 stream 理解成一个行为抽象,stream 应用在那些 message 上面,它可以直接决定,而不是 message 去决定