Golang后端开发工程师-远程工作机会

Golang后端开发工程师-远程工作机会 Vidoomy 是一家专注于视频广告的公司,业务遍布各大优质媒体网站:我们的广告资源库已涵盖超过 2,500 个网站!我们的目标是为所有广告主提供最佳的覆盖服务,并为每天信任我们的发布商实现收益最大化。

Vidoomy 正寻求扩充其运营团队,招聘一名 Go 后端开发工程师(远程职位)。我们希望找到一位对日常挑战充满兴趣,并渴望在像 Vidoomy 这样高速发展的公司中积累经验的人才。

要求: 至少 3 年以下领域经验:

  • 精通 PHP 并能熟练使用 Symfony 和/或其他 PHP 框架
  • 具备 Redis 和 GoLang 使用经验
  • 具备数据库(MySQL)管理经验
  • 英语水平:C1 级

以下经验将作为加分项:

  • 具备视频播放器和视频广告管理(VAST、VPAID

更多关于Golang后端开发工程师-远程工作机会的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

您好,

私信已发送,请查收。

此致,

Trish

更多关于Golang后端开发工程师-远程工作机会的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 @Vidoomy

我可以帮助你。 已发送私信,请查收。

谢谢 Lauren W.

根据职位描述,这是一个典型的混合技术栈后端岗位,对Go语言的要求是“具备使用经验”。以下从技术角度分析该职位对Go开发者的实际需求,并提供相应的代码示例:

核心要求分析:

  1. PHP/Symfony为主,Go为辅:职位明确要求“精通PHP”,Go仅作为加分项,表明现有系统可能以PHP为主,Go用于新模块或性能关键组件。
  2. 技术栈整合:需要处理PHP与Go的协同工作,可能涉及RPC通信或服务解耦。

Go在该岗位的典型应用场景及代码示例:

1. 高性能广告竞价引擎(Go核心优势)

package main

import (
    "encoding/json"
    "net/http"
    "time"
    "github.com/go-redis/redis/v8"
)

type BidRequest struct {
    AdPlacementID string  `json:"ad_placement_id"`
    UserID        string  `json:"user_id"`
    MaxBid        float64 `json:"max_bid"`
}

type BidResponse struct {
    BidPrice float64 `json:"bid_price"`
    AdURL    string  `json:"ad_url"`
    Creative string  `json:"creative"`
}

func bidHandler(rdb *redis.Client) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        var req BidRequest
        if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
            http.Error(w, err.Error(), http.StatusBadRequest)
            return
        }
        
        // Redis实时竞价数据查询
        ctx := r.Context()
        userHistory, _ := rdb.Get(ctx, "user:"+req.UserID).Result()
        
        // 竞价逻辑(简化示例)
        resp := BidResponse{
            BidPrice: calculateBid(req.MaxBid, userHistory),
            AdURL:    "https://cdn.vidoomy.com/ads/vast.xml",
            Creative: "video_ad_12345",
        }
        
        // 保证100ms内响应(广告竞价要求)
        w.Header().Set("Content-Type", "application/json")
        json.NewEncoder(w).Encode(resp)
    }
}

func calculateBid(maxBid float64, history string) float64 {
    // 实际复杂的竞价算法
    return maxBid * 0.85
}

2. 实时广告事件追踪系统

package main

import (
    "context"
    "fmt"
    "github.com/go-redis/redis/v8"
    "github.com/go-sql-driver/mysql"
    "database/sql"
)

type AdEvent struct {
    EventType string // "impression", "click", "complete"
    AdID      string
    Timestamp int64
    UserIP    string
}

func trackAdEvent(rdb *redis.Client, db *sql.DB) {
    // Redis Pub/Sub接收实时事件
    pubsub := rdb.Subscribe(context.Background(), "ad_events")
    defer pubsub.Close()
    
    ch := pubsub.Channel()
    for msg := range ch {
        var event AdEvent
        json.Unmarshal([]byte(msg.Payload), &event)
        
        // 实时处理
        processEvent(event)
        
        // 批量写入MySQL(异步)
        go func(e AdEvent) {
            _, err := db.Exec(
                "INSERT INTO ad_metrics (event_type, ad_id, timestamp) VALUES (?, ?, ?)",
                e.EventType, e.AdID, e.Timestamp,
            )
            if err != nil {
                fmt.Printf("DB insert error: %v\n", err)
            }
        }(event)
    }
}

3. PHP与Go服务通信示例(gRPC)

// Go gRPC服务端
package main

import (
    "context"
    "net"
    "google.golang.org/grpc"
    pb "path/to/proto"
)

type adServer struct {
    pb.UnimplementedAdServiceServer
}

func (s *adServer) GetAd(ctx context.Context, req *pb.AdRequest) (*pb.AdResponse, error) {
    return &pb.AdResponse{
        VastUrl: "https://vidoomy.com/vast.xml",
        Price:   4.32,
    }, nil
}

func main() {
    lis, _ := net.Listen("tcp", ":50051")
    s := grpc.NewServer()
    pb.RegisterAdServiceServer(s, &adServer{})
    s.Serve(lis)
}

4. VAST/VPAID处理模块

package vast

import (
    "encoding/xml"
    "io"
)

type VAST struct {
    XMLName xml.Name `xml:"VAST"`
    Version string   `xml:"version,attr"`
    Ads     []Ad     `xml:"Ad"`
}

type Ad struct {
    ID     string `xml:"id,attr"`
    InLine *InLine `xml:"InLine"`
}

func ParseVAST(r io.Reader) (*VAST, error) {
    var vast VAST
    if err := xml.NewDecoder(r).Decode(&vast); err != nil {
        return nil, err
    }
    return &vast, nil
}

技术建议:

  1. 重点准备PHP/Go整合场景:面试可能关注如何将现有PHP系统逐步迁移或与Go服务集成
  2. 强调Go在性能敏感场景的价值:广告竞价、实时数据处理等需要低延迟高并发的场景
  3. 展示Redis高级用法:广告系统的计数器、排行榜、实时缓存等
  4. 准备MySQL优化案例:广告数据通常涉及大量时间序列数据的存储和查询

该职位适合有PHP背景但希望转向Go的开发者,或熟悉广告技术栈的Go工程师。实际工作中可能需要维护PHP旧系统,同时用Go开发新功能。

回到顶部