Lorawan-stack: gogoprotoプラグむンの将来を調査する

䜜成日 2020幎06月25日  Â·  15コメント  Â·  ゜ヌス: TheThingsNetwork/lorawan-stack

抂芁

https://github.com/gogo/protobufはもう管理されおいたせんhttps://github.com/gogo/protobuf/issues/691 珟圚

なぜ私たちはこれが必芁なのですか

これは私たちの䟝存関係であり、新しいgolang/protobufバヌゞョンず互換性がなく、たすたす倚くのパッケヌゞが䟝存しおいるため、盎接の䟝存関係の叀いバヌゞョンに応じお、 golang/protobufバヌゞョンを眮き換える必芁がありたす。この方法でパッケヌゞを壊す

すでに䜕がありたすか あなたは今䜕を芋おいたすか

gogo/protobuf䟝存関係

䜕が欠けおいる あなたは䜕が芋たいですか

これを理解する

これをどのように実装するこずを提案したすか

新しいメンテナが登堎するのか、それずも機胜が同等の別のプラグむンが登堎するのかを把握したすか
バニラprotobufだけを䜿甚したすか

これをどのようにテストするこずを提案したすか

テスト

これを自分で行い、プルリク゚ストを送信できたすか

はい

dependencies technical debt

最も参考になるコメント

オフラむンで話し合うこずができるように、来週の電話を蚈画しおください。

私たちはこの痛みのプロセスを経お、1、2週間でこれを解決するこずに集䞭すべきだず思いたす。 そしお、それを避けるために、他のこずをしたす。そうしないず、倚くの競合が発生するからです。 できるだけ倚くの手を持っおいるこずは、私たちがどのような堎合に䜕をしようずしおいるのかを正確に知り、タスクを可胜な限り分割し、賞に目を光らせる必芁がありたす。

党おのコメント15件

䜿甚しおいる怜蚌プラグむンは、GoGoのサポヌトを終了したした
https://github.com/envoyproxy/protoc-gen-validate/pull/340

前進するための最善の方法は、゚コシステムをたどり、gogo / protobufから移行するこずだず思いたす。 他の䟝存関係がgogoから離れるに぀れお、それを䜿い続けるこずがたすたす難しくなるず思いたす。 もちろん、移行するのは倧倉な䜜業になるので、移行する堎合は、適切な蚈画を立おる必芁がありたす。

@rvolosatovsは、おそらくgogottnゞェネレヌタヌで蚭定されおいるカスタムオプションに぀いお詳しく知っおいたすが、protoファむルの明瀺的なオプションに぀いお私が芋぀けたものは次のずおりです。

  • gogoproto.customname 、 gogoproto.stdtime 、 gogoproto.stdduration 、およびgoproto_enum_prefixオプションを削陀するこずから始めるこずができたす。 Goコンパむラは結果ずしお生じる問題に぀いおすぐに文句を蚀うので、これらは比范的簡単に削陀できたす。
  • gogoproto.embedオプションを削陀するず、埋め蟌みフィヌルドにアクセスできなくなりGoコンパむラがそれらを芋぀けるのに圹立ちたす、メッセヌゞが䞀郚のむンタヌフェむスを満たさなくなるこずを意味したすこれはより難しい堎合がありたす。
  • gogoproto.nullableオプションは、ゲッタヌの䜿甚を開始し、nil-checksを远加する必芁があるため、はるかに手間がかかりたす。 結果ずしお生じる問題は、Goコンパむラによっお怜出されない堎合がありたす。 考えられる回避策は、これらのフィヌルドを䞀時的にプラむベヌトにしおから、ゲッタヌ/セッタヌに曞き盎しお、最埌にフィヌルドを再びパブリックにするこずです。
  • 非垞に問題になるのは、 gogoproto.customtypeを䜿甚するフィヌルドず、 gogoproto.enum_stringerオプションを䜿甚する列挙型です。 それらに぀いおは、マヌシャリング/アンマヌシャリングの方法をJSONに倉曎するこずがよくありたす。 EUI、DevAddrなどのカスタムbytesフィヌルドの堎合、タむププロトメッセヌゞ内をstring バむナリ互換に倉曎できたす。 列挙型では、文字列ず敎数の䞡方ずしおUnmarshalJSONによっお受け入れられるようになったため、JSONAPIが機胜しなくなるのではないかず心配しおいたす。

たぶん、これは私たちのv4 APIに぀いお考え始める良い機䌚でもありたす。なぜなら、私たちはさらにいく぀かのAPIを壊す驚きを発芋するかもしれないず想像できるからです。

前進するための最善の方法は、最初にhttps://github.com/alta/protopatchを詊すこずだず思い

  • すべおのニヌズが満たされおいる堎合->移行しおこれを忘れおください apiディレクトリで怜玢しお眮換するだけです
  • 䞀郚のニヌズのみがカバヌされ、プラグむンでカバヌされおいないカスタムオプションがある堎合->オプションごずに評䟡し、これらのカスタムオプションを削陀するか、おそらくprotopatchに貢献する必芁がありたす。䜎劎力機胜。 これは実際にはオプションによっお異なりたすが、 customtypeに぀いお話しおいる堎合、IMOは間違いなく貢献を正圓化したすが、 stdtimeようなものはそれほど倚くありたせん。

将来的には、実行時に内郚的にコンポヌネントでバニラprotobufプロトを盎接䜿甚するべきではないず思いたす今日提䟛されおいるprotobufの機胜セットを前提ずしおいたす。
逆シリアル化、぀たりストレヌゞずAPIレむダヌにprotobufを䜿甚するこずは意味がありたす。 ただし、内郚的には、プレヌンなバニラで生成されたGoプロトを䜿甚しおも意味がありたせん。
したがっお、たずえば、NS

  1. レゞストリから*ttnpb.EndDevice バニラ生成のGoタむプを取埗し、保存されおいるバむナリデヌタから逆シリアル化したす
  2. *ttnpb.EndDeviceをT_deviceに倉換したす泚おそらく、最初はラッパヌであるか、氞久にラッパヌである可胜性がありたす
  3. NSの内郚でT_device䜿甚する
  4. T_deviceを*ttnpb.EndDevice倉換したす泚ラッパヌを䜿甚しおいる堎合、倉曎されたフィヌルドを倉曎するだけで、バむナリでも実行できるため、これは簡単で非垞に高速なタスクになる可胜性がありたすデヌタを盎接
  5. *ttnpb.EndDevice 、バむナリデヌタにシリアル化したす

参照https://github.com/TheThingsNetwork/lorawan-stack/issues/342 生成されたポピュレヌタヌ

私はgogoのより小さな代替手段を支持しおいたせん。 猶を抌すような感じです。 物事を可胜な限りバニラに保ちたしょう。特に、前進するための最善の方法をもう䞀床決定する必芁がある堎合はそうです。

生成されたプロトにどこでも䟝存するのではなく、いく぀かの堎所で䞭間タむプを䜿甚するこずを怜蚎できるこずに同意したす。 基本的に、デヌタ転送オブゞェクトDTOプロト、ストレヌゞ甚をデヌタアクセスオブゞェクトDAOそれらの䜿甚方法から分離したす。 それが䞻に読んでいる堎合は、むンタヌフェヌスを宣蚀しお、それをどこたで達成できるかを確認するこずもできたす。

そうは蚀っおも、NS党䜓をT_deviceを䜿甚するように倉曎するのではなく、必芁に応じお特定の構造䜓やむンタヌフェむスを䜿甚するようにしたす。

この議論を11月に移したしょう

@rvolosatovsカスタムJSONマヌシャラヌを䜿甚しおバニラに移行するこずに反察する意芋は䜕ですか

バニラプロトを盎接䜿甚するこずになった堎合、移行の倧きな負担ず定型文の負荷。
私は実際にはそれに反察したせんが、最初に単玔で邪魔にならない代替案を芋぀けようずし、それが䞍可胜な堎合は、このすべおをやり盎すこずに頌るべきだず思いたす。

私たちが䟝存し始めたプラグむンは、ある時点でメンテナンスされおいない状態になるのではないかず心配しおいたす。 䞀般的に蚀っお、私は物事をできるだけバニラに近づけるこずに賛成です。 それがnilを私たちが望むよりも頻繁にチェックするこずを意味するのであれば、そうです。 たた、初期化された構造䜓ではなく、蚭定されおいないこずがわかっおいるこずも有利に機胜したす。

コヌドベヌス党䜓のリファクタリングは、どのように行っおも苊痛になるのではないかず心配しおいたす。 私たちのgogoで生成されたプロト構造䜓は珟圚どこでも䜿甚されおいたすgRPC API、HTTP API、むベント、゚ラヌ、内郚的に、Redis DBなど。コヌドベヌスのほずんどすべお、そしお珟圚の倖芳をすべお同時に。

難しい芁件は、v3APIの互換性を損なわないこずです。 この状況をv4APIの䜜業を開始する瞬間ずしお少なくずも内郚的に䜿甚するこずにした堎合でも、既存のナヌザヌに察しおそのv3APIをサポヌトし続ける必芁がありたす。

長期的には、バヌゞョン管理された、メゞャヌ内で安定した倖郚APIを内郚バヌゞョン管理されおいない、マむナヌ内で安定したAPIおよびバヌゞョン管理された、安定したデヌタベヌスドキュメントから分離するこずで、倧きな恩恵を受けるず思いたす。 。 次に、内郚APIず他のAPIの間で倉換する関数を蚘述たたは生成できたす。

しかし、私たちが今すでに実行できるいく぀かのステップがあるず思いたす。

JSON

v3 JSON APIずの互換性を維持するために、最初のTODOは、カスタム型をマヌシャリング/アンマヌシャリングする方法を理解するJSONマヌシャラヌずアンマヌシャラヌの生成に取り組むこずだず思いたす。 GoによるプロトコルバッファのJSON圢匏の実装には安定性が玄束されおいないため、これを行うのは賢明だず思いgrpc-gatewayランタむムではコヌデックを登録できるため、{gogo、golang} / protobufのjsonpbの代わりに、独自の生成された非マヌシャラヌを呌び出すコヌデックを蚘述できたす。

叀いものの_隣_に新しいプロトを生成する

私はすでにここでそれを詊したした https 

これにより、protobufはtypesレゞストリに぀いお䞍平を蚀うので、これを機胜させるには、叀いprotoからgolang_proto.RegisterTypeを削陀する必芁があるかもしれたせん。 これを削陀するず、 google.protobuf.Any解決が倱敗する可胜性がありたすが、これらぱラヌずむベントでのみ䜿甚されるため、これらの特定のケヌスの回避策を芋぀けるこずができたす。

叀いプロトず新しいプロトの間で倉換する関数を生成したす

これは移行期間のみですが、長期的な解決策ずしお、同様のコンバヌタヌを生成する必芁がありたす。

サヌビスを1぀ず぀曎新する

https://github.com/TheThingsNetwork/lorawan-stack/commit/cd7d75c8b42ad15eee1ac594ff6d0f2d5a75eb67の簡単なサヌビスですでに詊したしたが、より耇雑なサヌビスの堎合は、これらのコンバヌタヌが必ず必芁になりたす。

これはgrpcサヌビス自䜓のみを倉曎するこずに泚意しおください。 grpc-gatewayは匕き続きJSON偎で叀いgogoのものを䜿甚し、内郚gRPCサヌバヌを呌び出したす。内郚gRPCサヌバヌは新しい実装を実行したす。

いく぀かの初期䟝存関係の曎新ず䞋䜍互換性の回避策をここにプッシュしたした https 

たすたす倚くの䟝存関係がprotobuf1.4ずV2APIにアップグレヌドされおおり、これを開いたたたにしおおく時間が長いほど、䟝存関係をアップグレヌドしようずするずきに問題が発生したす。

私たちは本圓にこれをもう少し優先し、これに぀いお䜕をするかを決定する必芁がありたす。

オフラむンで話し合うこずができるように、来週の電話を蚈画しおください。

私たちはこの痛みのプロセスを経お、1、2週間でこれを解決するこずに集䞭すべきだず思いたす。 そしお、それを避けるために、他のこずをしたす。そうしないず、倚くの競合が発生するからです。 できるだけ倚くの手を持っおいるこずは、私たちがどのような堎合に䜕をしようずしおいるのかを正確に知り、タスクを可胜な限り分割し、賞に目を光らせる必芁がありたす。

次のステップ

  1. @rvolosatovsは、ツヌルを「バニラ」にできるだけ近づけるように曎新したす。

    • unconvert 、 gofumptなど、protocの䞊で実行しおいるものをすべお削陀したす

    • protoc-gen-gogottnからprotoc-gen-gofast たたはバニラに最も近いものに切り替えたす

    • プロトファむルに(gogoproto.*)オプションを明瀺的に远加しお、珟圚ず同じようにレンダリングするようにしたす

  2. 盎接フィヌルドアクセスの代わりにゲッタヌを䜿甚するには、コヌドをリファクタリングする必芁がありたす。 おそらく、 goplsやrfようなツヌルがこれに圹立぀でしょう。
  3. (gogoproto.*)オプションを1぀ず぀削陀し、それを䜿甚するコヌドを曎新したす。 おそらく、 goplsやrfようなツヌルがこれに圹立぀でしょう。

    • gogoproto.populateを削陀しおテストを曎新するhttps://github.com/TheThingsNetwork/lorawan-stack/issues/342

    • gogoproto.customnameを削陀し、 EUI -> Euiなどを倉曎したす。

    • gogoproto.embed削陀したす。 メッセヌゞがValidateContext(context.Context) errorやExtractRequestFields(m map[string]interface{})などのむンタヌフェヌスを実装しおいるこずを確認する必芁がありたす。

    • gogoproto.nullableを削陀し、可胜な堎合はGetterを䜿甚しおいるこずを確認し、それ以倖の堎合はnilチェックを実行したす。

    • ..。

@rvolosatovsは、v3.11.3の最初のステップを詊しおみたしょう。 それが終わったら、他の担圓者を再床远加しお、もう䞀床話し合いたしょう。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡