ホームページ >バックエンド開発 >Golang >go-zero を使用した分散型検索エンジンの実装

go-zero を使用した分散型検索エンジンの実装

WBOY
WBOYオリジナル
2023-06-22 17:59:181440ブラウズ

インターネット時代の到来に伴い、検索エンジンの役割はますます重要になってきています。インターネット ユーザーが最も一般的に使用するツールの 1 つである検索エンジンは、便利な検索方法を提供するだけでなく、ネットワーク情報のフィルタリングと分類のサポートも提供します。しかし、大規模なデータ量やユーザーの訪問を処理するには、従来の検索エンジン アーキテクチャではもはやニーズを満たすことができません。

分散型検索エンジン アーキテクチャは、従来のアーキテクチャのボトルネック問題を効果的に解決できます。異なるタスクを異なるノードに割り当てて実行することで、クラスタのコンピューティング リソースを最大限に活用し、クラスタの応答速度と安定性を向上させることができます。システム。現在の分散アーキテクチャ技術では、go-zero フレームワークは非常に優れた選択肢です。

go-zero は、Golang に基づいて開発された軽量のオープンソース マイクロサービス フレームワークです。コード生成、パラメータ検証、ルーティング、ロギング、エラー処理、キャッシュ、電流制限、その他の機能を含むツール チェーンの完全なセットを提供し、マイクロサービスの開発とメンテナンスを大幅に簡素化します。分散型検索エンジンの構築において、go-zero フレームワークは、高性能かつ高可用性のシステムを迅速に実装するのに役立ちます。

以下では、例を使用して go-zero を使用して分散検索エンジンを構築する方法を紹介します。

ステップ 1: 環境を構築する

まず、Golang と go-zero フレームワークをインストールする必要があります。インストール後、go-zero が提供するツール コマンド ラインを使用してプロジェクト テンプレートを生成します。コマンド ラインに

goctl api new search

と入力して、新しいプロジェクトを生成します。これに基づいて開発を開始できます。

ステップ 2: 構成の設定

分散検索エンジンを開発する場合、最も重要なステップは、システムの分散構成を定義することです。プロジェクトのルート ディレクトリに search-api.yaml という名前の構成ファイルを作成し、その中で次の構成情報を定義する必要があります。

Name: search # 服务名
Description: "搜索服务" # 服务描述
Version: 1.0.0 # 服务版本

Host: 127.0.0.1 # 服务绑定IP地址
Port: 8888 # 服务绑定端口号

Redis:
  Host: 127.0.0.1 # Redis服务地址
  Port: 6379 # Redis服务端口号
  Password: "" # Redis密码

Etcd:
  Hosts:
    - 127.0.0.1:2379 # Etcd集群地址

構成ファイルでは、サービス名、説明、バージョン、サービス バインディング アドレスとポート番号には、Redis と Etcd の構成情報も含まれます。このうち、Redis は検索結果のキャッシュに使用され、Etcd はサービスの登録と検出の実装に使用されます。

ステップ 3: API インターフェイスを定義する

次に、検索エンジンの API インターフェイスを定義する必要があります。 search/api/search.api で、次の内容を定義します。

syntax = "proto3";

package search.api;

option go_package = "search/api/search";

message Request {
    string keyword = 1;
    int32 page = 2;
    int32 size = 3;
}

message Response {
    repeated Result result = 1;
}

message Result {
    string title = 1;
    string url = 2;
    string abstract = 3;
}

service Search {
    rpc Query(Request) returns (Response);
}

検索 API では、Request リクエストと Response レスポンスのパラメーター、および Result 検索結果構造を定義します。検索 API には、ユーザーの検索キーワード、ページング情報、その他のパラメーターを受け入れ、検索結果を返す Query インターフェイスが含まれています。

ステップ 4: ビジネス ロジックの実装

API インターフェイスを定義したら、ビジネス ロジック コードの記述を開始できます。 search/internal/search/search.go では、検索リクエストの処理と検索結果のキャッシュが実装されています。特定のコード実装の詳細については、コメントを参照してください:

package search

import (
    "context"
    "encoding/json"

    "github.com/Yesterday17/go-search-engine/global"
    "github.com/Yesterday17/go-search-engine/internal/search/model"
    "github.com/Yesterday17/go-search-engine/internal/search/service"
    "github.com/Yesterday17/go-zero/core/stores/redis"
    "github.com/Yesterday17/go-zero/rest/httpx"
)

type Search struct {
    redis      *redis.Redis
    searchFunc func(string, int32, int32) ([]model.Result, error)
}

func NewSearch(redis *redis.Redis) *Search {
    return &Search{
        redis: redis,
        searchFunc: service.Search.implement,
    }
}

func (s *Search) Query(ctx context.Context, req *model.Request) (*model.Response, error) {
    resp := &model.Response{}
    key := generateKey(req.Keyword, req.Page, req.Size)

    // 搜索结果缓存
    result, err := s.redis.Get(key).Result()
    if err == nil {
        if err := json.Unmarshal([]byte(result), resp); err != nil {
            return nil, err
        }
        return resp, nil
    }

    result, err = s.searchFunc(req.Keyword, req.Page, req.Size)
    if err != nil {
        return nil, err
    }

    // 将搜索结果序列化为json,存储至redis
    data, err := json.Marshal(result)
    if err != nil {
        return nil, err
    }

    if err := s.redis.Set(key, string(data), global.SearchResultExpire).Err(); err != nil {
        return nil, err
    }

    resp.Result = result
    return resp, nil
}

func generateKey(keyword string, page, size int32) string {
    return "search_" + keyword + "_" + httpx.ConvertIntToString(int(page)) + "_" +
        httpx.ConvertIntToString(int(size))
}

コードでは、ユーザー リクエストを受信し、Redis から検索結果を取得するための Query メソッドを実装します。検索結果が Redis に存在する場合は、キャッシュされた結果が直接返されます。存在しない場合は、service.Search.implement メソッドが呼び出されて検索が実行され、検索結果は json にシリアル化されて Redis にキャッシュされます。

ステップ 5: サービスを開始する

最後のステップは、検索サービスを開始することです。検索ディレクトリのコマンド ラインで次のコマンドを実行します。

go run search.go -f api/search.api -s svc.yaml -c search-api.yaml

サービスが正常に開始されたら、localhost:8888/search/query インターフェイスにアクセスして、検索機能の実装をテストできます。

概要

この記事では、go-zero フレームワークを使用して分散検索エンジンを迅速に構築する方法を紹介します。分散システム開発では、go-zero フレームワークの柔軟性と効率性が広く認識されており、マイクロサービスや同時実行性の高いビジネス シナリオで広く使用されています。この記事が、分散システム開発技術を習得したい読者の参考になれば幸いです。

以上がgo-zero を使用した分散型検索エンジンの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。