強力なJavaScriptによりスノーフレークアルゴリズムが実現

強力なJavaScriptによりスノーフレークアルゴリズムが実現

[[353520]]

この記事はWeChat公式アカウント「妹の味」から転載したもので、著者は妹が飼っている犬です。記事を転載する場合は、ミスシスターテイスト公式アカウントまでご連絡ください。

それは正しい。フロントエンドは、バックエンドをピットインするために使用されます。

ここではそのような恥知らずな発言しかできません。 xjjdog のスキルは主にバックエンドに反映されるため、彼は犬も愛しています。これは、苦労が人間の基本的な属性であることを示しています。プログラマーは、製品マネージャーやプロジェクト マネージャーであるだけでなく、内部的に単一のグループではありません。

しかし、今回議論する問題は実は非常に難しいものです。それはシステム全体をほぼ破壊し、不機嫌な上司の顔にニキビが爆発する原因となった。

その影響はこれに限定されません。業界全体への拡大:

かつては大金を稼げた人たちが破産した。

本来なら結婚できた人たちも別れた。

昔はサボることができた人たちが、今では残業している。

かつてフロントエンドで働いていた人たちが、今はバックエンドで働いています。

本来退職できるはずだった人たちも退職を延期している。

もともと生きていた人たちは亡くなってしまいました。

以前は週に2日休みがありましたが、今は長い週と短い週があります。

素晴らしい js がなぜこんなに強力なのか? 詳しく説明するので聞いてください。

1. すべてには理由がある

タイトルにあるように、これはスノーフレーク アルゴリズムに関連します。

当社ではMySQLデータベースを使用するシステムを採用しており、データベースの主キーを選択する際に自動増分IDを使用しています。

  1. ID INT   主要な キー自動増分

この種の ID はシンプルでスムーズですが、いくつかの欠点があります。ただし、一般的なシステムには十分です。

プロジェクトチームは、オンラインになる前に、社内で最も優秀な建築家を招き、プロジェクトの包括的な物理的検査を実施しました。重要な対策の 1 つは、ID ジェネレーターを対象としています。

「現在の開発システムでは、少なくとも ID ジェネレーターとして Snowflake を使用する必要があるのではないでしょうか?」アーキテクトは、自己増分 ID ソリューションに非常に不満でした。

システムの拡張、データベースとテーブルのシャーディング、データの移行などのシナリオに遭遇した場合、UUID を使用する場合でも、自己増分 ID よりも優れていることを指摘しています。

みんなで話し合った結果、とても合理的だと感じました。 UUID は乱雑すぎるし、Meituan Leaf は複雑すぎる。時代遅れの Snowflake を使用して、最も単純な ID を直接生成する方がよい。

こんな感じです。

  1. 527574217068392807
  2. 527574217068392808

直感的に理解できるように、Java の Long の最大値を見てみましょう。

  1. 9223372036854775807

Intの最大値を見てみましょう。

  1. 2147483647

生成された Snowflake ID は、Int よりも大きいが Long よりも小さい値 (最大のものと比較) であることがわかります。そのため、データベースに保存するには bigint を使用するのが最適です。

とにかくやってみてください。バッチスクリプトを変更すると、主キーはより大きくなり、長くなります~~~

2. 問題が発生する

言うまでもなく、この種の ID は見た目も非常に美しいです。 ID は URL とフォームデータで渡されるため、一見するとよりプロフェッショナルに見えます。

  1. /edit.do?id=527574217068392810

提案どおりにシステムを変更した後、ユニットテストはスムーズに進みました。ブラック ボックス テストは簡単にクリックしただけで合格とみなされました。

超常現象は依頼人によって発見された。

顧客は、多くのレコードを編集または削除できなかったと述べました。記録が見つからないとのことです。

多くの企業の本質はご存知でしょう。顧客とコミュニケーションをとる人たちは、たいていテクノロジーをあまりよく理解していません。私は素晴らしい携帯電話で顧客の画面の写真を撮りましたが、受け取った元の写真のサイズは 10 MB を超えていました。しかし不思議なのは、写真は大きいのに内容がぼやけているということです。

バックエンドプログラマーは目を細めて画像を開き、そこに表示されているIDを抽出し、システムで確認しました。

そのような記録はありません。

目を細める姿勢に何か問題があるに違いない。バックエンドプログラマーはそれを再度記録する必要がありました。残念ながら、これに関する記録はまだありません。

顧客のデータベースをコピーする以外に選択肢はありませんでした。ページをクリックしてみると、確かに問題があることがわかりました。

ブラウザのレスポンスで返されるデータはプレビューで返されるデータと異なります

3. 問題の検証

つまり、正しい数字 527183991665594368 は、ブラウザによって変換されると 527183991665594400 になります。

ブラウザの開発ツールでデバッグしてみましょう。

さらに検証するために、Typescript から js に試してみます。

  1. # 猫テスト.ts
  2. a = 527183991665594368 とします。
  3. コンソールにログ出力します。
  4. # tsc テスト.ts
  5. # 猫テスト.js
  6. var a = 527183991665594368;
  7. コンソールにログ出力します。
  8. # ノードテスト.js
  9. 527183991665594400

この問題は js エコシステム全体に存在し、バックエンドを台無しにしていることがわかります。

4. なぜですか?

理由はこうです。 JavaScript には 2 種類の数値があります。 Number と BigInt。最もよく使われるのは数字です。

最大の数値は Number.MAX_SAFE_INTEGER と呼ばれ、その値は次のとおりです。

2^53-1または

+/- 9,007,199,254,740,991

ご存知のとおり、Java の Long は 64 ビットです。 Js のこの安全な整数は、Java で定義された長さにまったく達しません。

これは、Long の長さが 17 ビットを超えると精度が低下するという、悪質な IEEE_754 仕様です。

最新の TypeScript 3.2 では、エンコードに BigInt 型を直接使用したり、カプセル化された long.js を使用したりすることもできますが、それでも面倒でコーディングが多すぎるため、見逃してしまう可能性があります。

デジタルタイプを使用してデータを送信することは、実際にはあまり信頼性が高くありません。多くの紆余曲折を経て、状況はまったく異なります。

最善の方法は、文字列を使用して渡すことです。将来的にバックグラウンド ID の長さが 128 ビットになったとしても、この変換を気にする必要はありません。

Java では、Jackson を使用すると、データベースを変更せずに、アノテーションを通じて文字列を直接変更できます。

  1. @JsonSerialize(ToStringSerializer.class を使用)
  2. プライベートな Long ID;

この問題は明らかにバックエンドのせいではありません。バックエンドは正しいデータをフロントエンドに渡します。処理できるかどうか、正しく処理されるかどうかは、バックエンドとはまったく関係ありません。この仕様に従った JS の非標準的な処理により、多くの人が罠に陥っています。新人であろうとベテランであろうと、次々と罠に落ちていく。この特徴は実に反人間的だと言わざるを得ない。

しかし、バックエンドでは解決できました。フルスタックルートを取るように誰が言ったのでしょうか? 必要であれば、製品作業も行えます!

著者について: Sister Taste (xjjdog)、プログラマーが寄り道をすることを許可しない公開アカウント。インフラストラクチャと Linux に重点を置きます。 10 年間のアーキテクチャと 1 日あたり数千億のトラフィックを基に、私たちはお客様とともに高並行性の世界を探求し、新たな体験をお届けします。私の個人 WeChat は xjjdog0 です。今後のコミュニケーションのために、ぜひ私を友達として追加してください。

<<:  AIの諸刃の剣:質問を検索するために写真を撮ることと不正行為を支援すること

>>:  5G、IoT、AI、機械学習は2021年に最も重要なテクノロジーとなる

ブログ    
ブログ    
ブログ    

推薦する

顔認識の時代に顔を守る方法

シャオ・ワンは最近少しイライラしている。毎日仕事が終わったらすぐにジムに行って運動していたのですが、...

...

...

上海交通大学が「人間行動理解エンジン」を発表:AIが超大作映画のあらゆる行動をフレームごとに理解

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

人工知能はテクノロジーとデータガバナンスの進化を推進する

2019年以降、アジア太平洋地域全体で政府主導のAIに関する取り組みが急増しています。これらの取り組...

CatBoost: XGBoost よりも優れた GBDT アルゴリズム

[[242113]] [51CTO.com クイック翻訳] インターネット アルゴリズムには、推奨シ...

人工知能の分野は大きな需要があり、金融​​人材の将来性は有望である

[[408300]]重慶ビジネスデイリー・商油新聞記者が本について語る大学入試願書を記入中です。専攻...

...

2021 年の人工知能の最新動向を示す 15 のグラフ

2021年AIインデックスレポートは、スタンフォード大学の人間中心AI研究所と、ハーバード大学、経済...

人工知能システムにおける不確実性の定量化

翻訳者 | 朱 仙中校正 | 梁哲、孫淑娟まとめ人工知能 (AI) ベースのシステムは大きな可能性を...

...

わずか 2 分で、シングル ビューの 3D 生成が高速かつ良好に行えます。北京大学などが新しいRepaint123法を提案

画像を 3D に変換する方法としては、通常、スコア蒸留サンプリング (SDS) 方式が採用されていま...

人工知能と機械学習は、組織がデジタルシステムを運用する上でますます重要になる

[[280794]]いくつかの困難や障害にもかかわらず、多くの企業がデジタル変革プロジェクトで大きな...

人工知能の分野では、すでに世界中で 10 個の画期的な技術が存在します。

[[238191]]人工知能はハイテクで、多岐にわたり、多次元的で、学際的な統合装置であり、ビッグ...