Rumah >pembangunan bahagian belakang >Golang >Melaksanakan sistem pemprosesan imej teragih yang sangat berskala: aplikasi dan amalan go-zero

Melaksanakan sistem pemprosesan imej teragih yang sangat berskala: aplikasi dan amalan go-zero

WBOY
WBOYasal
2023-06-23 11:57:271377semak imbas

Dengan perkembangan teknologi moden, teknologi pemprosesan imej memainkan peranan yang semakin meningkat dalam semua lapisan masyarakat. Daripada sistem pengawasan di bandar pintar, kepada diagnosis dan rawatan pengimejan perubatan, kepada permainan dan pengeluaran filem dan televisyen dalam industri hiburan, algoritma pemprosesan imej merupakan salah satu daripada teknologi teras yang amat diperlukan. Walau bagaimanapun, dengan pertumbuhan data imej dan bilangan pengguna, penyelesaian pemprosesan imej tradisional secara beransur-ansur tidak dapat memenuhi keperluan konkurensi tinggi, kependaman rendah dan berskala tinggi Oleh itu, sistem pemprosesan imej yang diedarkan secara beransur-ansur menjadi penyelesaian arus perdana.

Di antara banyak rangka kerja pemprosesan imej yang diedarkan, go-zero ialah rangka kerja pembangunan bahagian belakang yang patut diberi perhatian. Ia menyediakan set lengkap penyelesaian perkhidmatan mikro yang diedarkan, termasuk get laluan API, tadbir urus perkhidmatan, Ciri terhad seperti strim. pemutus litar, penyimpanan data besar-besaran dan transaksi yang diedarkan. Apabila membangunkan dan menggunakan sistem pemprosesan imej, sokongan komprehensif go-zero boleh meningkatkan kebolehpercayaan dan prestasi sistem dengan banyak. Artikel ini akan memperkenalkan aplikasi dan amalan go-zero dalam pemprosesan imej teragih dari pelbagai aspek seperti senario aplikasi, reka bentuk seni bina, pemilihan teknologi dan pelaksanaan kod.

1. Senario Aplikasi

Sistem pemprosesan imej adalah aplikasi intensif data dan pengkomputeran biasa yang dihadapi termasuk:

  1. Jumlah yang besar data dan keselarasan permintaan tinggi: Untuk senario yang memerlukan respons segera, seperti sistem pemantauan masa nyata dan sistem siaran langsung, ratusan ribu atau bahkan jutaan data imej boleh dijana sesaat data ini dan menyediakan pemprosesan tinggi, perkhidmatan kependaman rendah.
  2. Pengiraan tugas yang rumit: Menghadapi tugasan intensif pengiraan seperti algoritma imej kompleks dan model pembelajaran mendalam, adalah perlu untuk menyelesaikan pelbagai operasi pemprosesan imej dengan cepat dan tepat seperti pengekstrakan ciri imej, pengelasan, pengecaman dan sintesis.
  3. Ketersediaan tinggi dan berskala tinggi: Di ​​bawah keperluan perniagaan yang berubah-ubah, sistem perlu tersedia dan berskala tinggi, mampu menangani situasi tidak normal seperti trafik dan kegagalan nod secara tiba-tiba, serta mencapai perkhidmatan yang berterusan dan stabil.

go-zero boleh digunakan pada pelbagai senario yang menghadapi masalah di atas, seperti:

  1. Sistem pengelasan imej: Kelaskan imej, seperti muka dan kereta model , makanan, dsb. untuk pengenalan automatik.
  2. Sistem sintesis imej: Menggabungkan berbilang imej ke dalam satu imej, seperti penyambungan gambar, sintesis imej produk konkrit, dsb.
  3. Sistem pemantauan: Lakukan pemprosesan masa nyata imej, seperti statistik aliran orang, pengecaman teks, dsb., dan tukar data imej kepada data statistik yang boleh digunakan.

2. Reka bentuk seni bina

Untuk memenuhi keperluan di atas, kami perlu mereka bentuk sistem pemprosesan imej teragih yang boleh dipercayai, berskala dan cekap. Dengan bantuan go-zero, kami boleh mencapai reka bentuk infrastruktur berikut:

  1. Gerbang API: Menyediakan perkhidmatan get laluan antara muka API web untuk mengurus permintaan daripada pelanggan yang berbeza secara seragam.
  2. Perkhidmatan RPC: Perkhidmatan perniagaan, bertanggungjawab untuk tugas pemprosesan imej tertentu, menggunakan model perkhidmatan mikro teragih, dibahagikan dan digunakan mengikut perniagaan.
  3. Perkhidmatan Konfigurasi: Perkhidmatan konfigurasi, yang mengurus dan mengedarkan konfigurasi awam secara seragam.
  4. Pengurusan Sumber: Pengurusan sumber, termasuk pemantauan, kawalan aliran, kemerosotan pemutus litar, pengehadan semasa dan fungsi lain untuk memastikan penggunaan sumber sistem yang munasabah dan prestasi yang stabil.
  5. Perkhidmatan Storan: Simpan data yang diproses dalam sistem storan kongsi yang diedarkan awan untuk memudahkan akses dan pertanyaan perniagaan berikutnya.

3 Pemilihan Teknologi

Apabila mereka bentuk penyelesaian teknikal tertentu, kita boleh memilih beberapa teknologi tradisional dan algoritma yang sesuai untuk pemprosesan imej, dan kemudian menggunakan go-zero untuk menyediakan rangka kerja Microservice dan beberapa teknologi teragih arus perdana digunakan untuk merealisasikan fungsi keseluruhan sistem.

Secara khusus, ia boleh dilaksanakan menggunakan teknologi berikut:

  1. Algoritma pemprosesan imej: Menggunakan algoritma pemprosesan imej tradisional, seperti OpenCV, PIL dan perpustakaan lain serta beberapa model pembelajaran mendalam, ia boleh dicapai Pelbagai tugas pemprosesan imej seperti pengekstrakan ciri, pengelasan, pengecaman, dan sintesis imej.
  2. Rangka kerja perkhidmatan mikro: Menggunakan rangka kerja mikroperkhidmatan go-zero, anda boleh membina sistem pemprosesan imej teragih dengan cepat untuk mencapai pembahagian tugas, pembangunan logik perniagaan, pengimbangan beban, pemulihan kerosakan dan fungsi lain.
  3. Teknologi teragih: Teknologi koordinasi teragih seperti etcd dan zookeeper boleh digunakan untuk merealisasikan fungsi seperti pendaftaran perkhidmatan dan penemuan, pengurusan konfigurasi, dsb., menjadikan sistem lebih stabil dan boleh dipercayai.
  4. Lapisan storan: Anda boleh memilih sistem storan kongsi yang diedarkan, seperti FastDFS, dsb., untuk berkongsi dan mengurus data yang diproses.

4. Pelaksanaan Kod

Apabila melaksanakan fungsi di atas, kita boleh menggunakan rangka kerja kod yang disediakan oleh go-zero untuk melengkapkan logik perniagaan dan pelaksanaan teknikal tertentu. Berikut ialah contoh program yang mewakili proses pembangunan sistem pemprosesan imej teragih yang lengkap.

Mula-mula, perkenalkan rangka kerja dan pakej kebergantungan yang diperlukan dalam main.go:

package main

import (
    "github.com/tal-tech/go-zero/core/conf"
    "github.com/tal-tech/go-zero/core/logx"
    "github.com/tal-tech/go-zero/rest"
)

func main() {
    logx.Disable()
    var c Config
    conf.MustLoad(&c)

    server := rest.MustNewServer(c.RestConf)
    defer server.Stop()

    InitHandlers(server.Group("/"))

    go func() {
        select {
        case <-server.Done():
            logx.Info("Stopping...")
        }
    }()
    server.Start()
}

Antaranya, struktur Config menyimpan maklumat konfigurasi sistem, yang dikonfigurasikan dalam pakej config.toml; Menyediakan enkapsulasi perkhidmatan HTTP dan melaksanakan logik perniagaan khusus dalam fungsi InitHandlers

func InitHandlers(group *rest.Group) {
    group.POST("/image/:type", func(ctx *rest.Context) {
    // 业务逻辑:根据type参数分发图像任务,调用具体的RPC服务进行处理
    })
}

Seterusnya, melaksanakan logik perniagaan khusus dalam pakej pengendali.

package handlers

import (
    "context"
    "encoding/base64"
    "github.com/tal-tech/go-zero/core/logx"
    "github.com/tal-tech/go-zero/rest/httpx"
    "github.com/tal-tech/go-zero/zrpc"
    "github.com/yanyiwu/gojieba"
    "go-zero-example/service/image/api/internal/logic"
    "go-zero-example/service/image/api/internal/svc"
    "go-zero-example/service/image/rpc/image"
)

const (
    FACE_DETECT = iota
    FACE_RECOGNITION
    COLOR_DETECT
)

var jieba = gojieba.NewJieba()

type ImageType int32

type ImageHandler struct {
    ctx    context.Context
    svcCtx *svc.ServiceContext
}

func NewImageHandler(ctx context.Context, svcCtx *svc.ServiceContext) *ImageHandler {
    return &ImageHandler{ctx: ctx, svcCtx: svcCtx}
}

func (l *ImageHandler) Handle(reqTypes []ImageType, base64Data string) (*image.Data, error) {
    req := logic.ImageReq{
        ReqTypes:   reqTypes,
        Base64Data: base64Data,
    }

    // 将图像处理请求分发给所有RPC服务
    results := make([]*image.Data, 0, len(reqTypes))
    for _, reqType := range reqTypes {
        data, err := l.svcCtx.ImageRpcClient.DoImage(l.ctx, &image.ImageReq{
            ImageType: int32(reqType),
            ImageData: base64Data,
        })
        if err != nil {
            logx.WithError(err).Warnf("image rpc call failed: %v", data)
            return nil, httpx.Error(500, "服务内部错误")
        }

        results = append(results, data)
    }

    // 直接返回结果
    return logic.MergeResults(results), nil
}

// 字符串转float
func str2float(str string, defVal float64) float64 {
    if len(str) == 0 {
        return defVal
    }
    val, err := strconv.ParseFloat(str, 64)
    if err != nil {
        return defVal
    }
    return val
}

// 字符串转int
func str2int(str string, defVal int64) int64 {
    if len(str) == 0 {
        return defVal
    }
    val, err := strconv.ParseInt(str, 10, 64)
    if err != nil {
        return defVal
    }
    return val
}

// 合并处理结果
func (l *ImageHandler) MergeResults(datas []*image.Data) *image.Data {
    if len(datas) == 1 {
        return datas[0]
    }
    mergeData := &image.Data{
        MetaData: &image.MetaData{
            Status:  0,
            Message: "success",
        },
    }

    for _, data := range datas {
        if data.MetaData.Status != 0 {
            return data // 异常情况
        }
        switch data.DataType {
        case image.DataType_STRING:
            if mergeData.StringData == nil {
                mergeData.StringData = make(map[string]string)
            }
            for k, v := range data.StringData {
                mergeData.StringData[k] = v
            }
        case image.DataType_NUMBER:
            if mergeData.NumberData == nil {
                mergeData.NumberData = make(map[string]float64)
            }
            for k, v := range data.NumberData {
                mergeData.NumberData[k] = v
            }
        case image.DataType_IMAGE:
            if mergeData.ImageData == nil {
                mergeData.ImageData = make([]*image.ImageMeta, 0)
            }
            mergeData.ImageData = append(mergeData.ImageData, data.ImageData...)
        }
    }
    return mergeData
}

Akhir sekali, kami boleh menentukan antara muka perkhidmatan RPC khusus dalam image.proto, seperti yang ditunjukkan di bawah:

syntax = "proto3";

package image;

service ImageApi {
    rpc DoImage(ImageReq) returns (Data) {}
}

message ImageReq {
    int32 image_type = 1;
    string image_data = 2;
}

message ImageMetaData {
    int32 status = 1;
    string message = 2;
}

message Data {
    ImageMetaData meta_data = 1;
    DataType data_type = 2;
    map<string, string> string_data = 3; 
    map<string, float> number_data = 4;
    repeated ImageMeta image_data = 5;

}

// 可返回的数据类型
enum DataType {
    STRING = 0;
    NUMBER = 1;
    IMAGE = 2;
}

message ImageMeta {
    string url = 1;
    int32 width = 2;
    int32 height = 3;
}

至此,一个完整的分布式图像处理系统就具备了基础的功能和业务逻辑,可以部署到服务器中,供用户使用。

五、总结

本文介绍了go-zero在分布式图像处理中的应用和实践,从应用场景、架构设计、技术选型、代码实现等方面对图像处理系统进行了详细阐述。针对图像处理系统的特点,go-zero提供了一套全面的分布式微服务解决方案,可以快速搭建高可扩展性的系统,提高系统的性能和可靠性,同时也为开发者提供了产品支持和服务保障,适用于多种应用场景。

Atas ialah kandungan terperinci Melaksanakan sistem pemprosesan imej teragih yang sangat berskala: aplikasi dan amalan go-zero. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn