中高级Golang后端工程师招聘

中高级Golang后端工程师招聘 大家好,新年快乐!

SumUp 柏林正在寻找高级和中级的后端工程师加入我们的商户获取团队。完整的职位描述请参见此处:https://grnh.se/0d93c4c62us

我们提供的待遇中包含为您(及您的家人)准备的搬迁安置方案;在疫情结束前,完全远程工作是可以接受的。之后,我们将过渡到混合工作模式。

为什么考虑这个职位?

  1. 我们可以为您提供大量的成长和进一步发展机会。📚 我们已经建立了多个项目,包括双轨职业发展路径(您可以向首席工程师或领导角色发展)和每年2000欧元的教育预算。我们定期举办黑客日和社交活动,以促进与柏林充满活力的工程社区的交流。此外,我们还提供内部流动计划,有机会加入 SumUp 内部的其他团队,以及各种关于公共演讲和无意识偏见等软技能主题的培训项目。

  2. 我们是一家前景光明的可靠雇主选择。🚀 在最近一轮3.3亿欧元的融资支持下,我们拥有2400多名员工的团队仍在不断壮大。我们近期的增长使我们能够为全球31个国家(并且还在增加)的数百万小企业提供服务。目前,我们在全球拥有超过300万活跃商户。SumUp 持续发展,并得到了 TPG、Bain Capital Credit、Groupon、Holtzbrinck Ventures 等知名风险投资公司的支持。随着我们不断开拓新市场和新产品领域,我们对工程支持的需求也在持续增长!

  3. 您的工作很重要。❤️ 商户获取是一个关键的业务领域,它使我们能够扩展到新市场。您的贡献直接影响着 SumUp 的一个核心目标,即通过我们的工具连接小型商户。

直接在此处申请 https://grnh.se/0d93c4c62us - 我们承诺在24小时内回复 🙂


更多关于中高级Golang后端工程师招聘的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

嗨,加里,我们目前不需要外部支持;无论如何,谢谢!

更多关于中高级Golang后端工程师招聘的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好,最近怎么样?

我可以协助你完成需求。

为了进一步讨论,我们可以通过以下方式联系:Skype - cis.garry

邮箱 - garry@cisinlabs.com

作为Go语言后端工程师,看到SumUp的招聘信息,我认为这是一个很好的职业发展机会。以下是我对职位要求中可能涉及的Go技术点的分析:

Go技术栈分析

从职位描述来看,这是一个需要处理高并发、分布式系统的后端岗位。以下是一些可能涉及的技术方向:

1. 微服务架构

// 典型的微服务结构示例
package main

import (
    "context"
    "net/http"
    
    "github.com/gorilla/mux"
    "go.uber.org/zap"
)

type MerchantService struct {
    logger *zap.Logger
    // 数据库连接、缓存等依赖
}

func (s *MerchantService) GetMerchantHandler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    merchantID := mux.Vars(r)["id"]
    
    // 业务逻辑处理
    merchant, err := s.getMerchant(ctx, merchantID)
    if err != nil {
        s.logger.Error("获取商户失败", zap.Error(err))
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    
    // 响应处理
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(merchant)
}

2. 并发处理模式

// 使用goroutine和channel处理并发请求
func ProcessBatchMerchants(ctx context.Context, merchantIDs []string) ([]Merchant, error) {
    var wg sync.WaitGroup
    results := make(chan Merchant, len(merchantIDs))
    errCh := make(chan error, 1)
    
    for _, id := range merchantIDs {
        wg.Add(1)
        go func(merchantID string) {
            defer wg.Done()
            
            select {
            case <-ctx.Done():
                return
            default:
                merchant, err := fetchMerchant(ctx, merchantID)
                if err != nil {
                    select {
                    case errCh <- err:
                    default:
                    }
                    return
                }
                results <- merchant
            }
        }(id)
    }
    
    go func() {
        wg.Wait()
        close(results)
        close(errCh)
    }()
    
    // 收集结果
    var merchants []Merchant
    for merchant := range results {
        merchants = append(merchants, merchant)
    }
    
    select {
    case err := <-errCh:
        return nil, err
    default:
        return merchants, nil
    }
}

3. 数据库和缓存集成

// 使用GORM和Redis的示例
type MerchantRepository struct {
    db    *gorm.DB
    cache *redis.Client
}

func (r *MerchantRepository) GetByID(ctx context.Context, id string) (*Merchant, error) {
    // 先查缓存
    cacheKey := fmt.Sprintf("merchant:%s", id)
    cached, err := r.cache.Get(ctx, cacheKey).Result()
    if err == nil {
        var merchant Merchant
        if err := json.Unmarshal([]byte(cached), &merchant); err == nil {
            return &merchant, nil
        }
    }
    
    // 缓存未命中,查数据库
    var merchant Merchant
    if err := r.db.WithContext(ctx).Where("id = ?", id).First(&merchant).Error; err != nil {
        return nil, err
    }
    
    // 写入缓存
    merchantJSON, _ := json.Marshal(merchant)
    r.cache.Set(ctx, cacheKey, merchantJSON, 10*time.Minute)
    
    return &merchant, nil
}

4. API设计和中间件

// RESTful API设计示例
func RegisterMerchantRoutes(r *mux.Router, service *MerchantService) {
    api := r.PathPrefix("/api/v1/merchants").Subrouter()
    
    // 应用中间件
    api.Use(loggingMiddleware)
    api.Use(authenticationMiddleware)
    api.Use(rateLimitMiddleware)
    
    api.HandleFunc("", service.CreateMerchantHandler).Methods("POST")
    api.HandleFunc("", service.ListMerchantsHandler).Methods("GET")
    api.HandleFunc("/{id}", service.GetMerchantHandler).Methods("GET")
    api.HandleFunc("/{id}", service.UpdateMerchantHandler).Methods("PUT")
    api.HandleFunc("/{id}", service.DeleteMerchantHandler).Methods("DELETE")
}

// 认证中间件示例
func authenticationMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        token := r.Header.Get("Authorization")
        if token == "" {
            http.Error(w, "未授权", http.StatusUnauthorized)
            return
        }
        
        // 验证token逻辑
        claims, err := validateToken(token)
        if err != nil {
            http.Error(w, "无效token", http.StatusUnauthorized)
            return
        }
        
        // 将用户信息存入上下文
        ctx := context.WithValue(r.Context(), "user", claims)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

5. 测试和监控

// 单元测试示例
func TestMerchantService_GetMerchant(t *testing.T) {
    // 模拟依赖
    mockRepo := new(MockMerchantRepository)
    mockRepo.On("GetByID", mock.Anything, "test-id").
        Return(&Merchant{ID: "test-id", Name: "测试商户"}, nil)
    
    service := NewMerchantService(mockRepo)
    
    // 测试逻辑
    merchant, err := service.GetMerchant(context.Background(), "test-id")
    assert.NoError(t, err)
    assert.Equal(t, "测试商户", merchant.Name)
    mockRepo.AssertExpectations(t)
}

// 性能监控
func instrumentedHandler(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        
        // 包装ResponseWriter以捕获状态码
        rw := &responseWriter{ResponseWriter: w}
        next.ServeHTTP(rw, r)
        
        // 记录指标
        duration := time.Since(start)
        metrics.RequestDuration.WithLabelValues(
            r.Method,
            r.URL.Path,
            strconv.Itoa(rw.status),
        ).Observe(duration.Seconds())
    })
}

技术建议

对于申请这个职位的Go工程师,我建议重点准备以下方面:

  1. 分布式系统设计 - 理解微服务架构、服务发现、负载均衡
  2. 并发编程 - 深入理解goroutine、channel、sync包
  3. 性能优化 - 掌握pprof、trace等工具的使用
  4. 错误处理 - Go特有的错误处理模式和最佳实践
  5. 测试驱动开发 - 单元测试、集成测试、压力测试

这个职位看起来需要处理全球商户数据,涉及高并发和分布式系统,对Go工程师的技术深度有较高要求。

回到顶部