中高级Golang后端工程师招聘
中高级Golang后端工程师招聘 大家好,新年快乐!
SumUp 柏林正在寻找高级和中级的后端工程师加入我们的商户获取团队。完整的职位描述请参见此处:https://grnh.se/0d93c4c62us
我们提供的待遇中包含为您(及您的家人)准备的搬迁安置方案;在疫情结束前,完全远程工作是可以接受的。之后,我们将过渡到混合工作模式。
为什么考虑这个职位?
-
我们可以为您提供大量的成长和进一步发展机会。📚 我们已经建立了多个项目,包括双轨职业发展路径(您可以向首席工程师或领导角色发展)和每年2000欧元的教育预算。我们定期举办黑客日和社交活动,以促进与柏林充满活力的工程社区的交流。此外,我们还提供内部流动计划,有机会加入 SumUp 内部的其他团队,以及各种关于公共演讲和无意识偏见等软技能主题的培训项目。
-
我们是一家前景光明的可靠雇主选择。🚀 在最近一轮3.3亿欧元的融资支持下,我们拥有2400多名员工的团队仍在不断壮大。我们近期的增长使我们能够为全球31个国家(并且还在增加)的数百万小企业提供服务。目前,我们在全球拥有超过300万活跃商户。SumUp 持续发展,并得到了 TPG、Bain Capital Credit、Groupon、Holtzbrinck Ventures 等知名风险投资公司的支持。随着我们不断开拓新市场和新产品领域,我们对工程支持的需求也在持续增长!
-
您的工作很重要。❤️ 商户获取是一个关键的业务领域,它使我们能够扩展到新市场。您的贡献直接影响着 SumUp 的一个核心目标,即通过我们的工具连接小型商户。
直接在此处申请 https://grnh.se/0d93c4c62us - 我们承诺在24小时内回复 🙂
更多关于中高级Golang后端工程师招聘的实战教程也可以访问 https://www.itying.com/category-94-b0.html
嗨,加里,我们目前不需要外部支持;无论如何,谢谢!
更多关于中高级Golang后端工程师招聘的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
作为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工程师,我建议重点准备以下方面:
- 分布式系统设计 - 理解微服务架构、服务发现、负载均衡
- 并发编程 - 深入理解goroutine、channel、sync包
- 性能优化 - 掌握pprof、trace等工具的使用
- 错误处理 - Go特有的错误处理模式和最佳实践
- 测试驱动开发 - 单元测试、集成测试、压力测试
这个职位看起来需要处理全球商户数据,涉及高并发和分布式系统,对Go工程师的技术深度有较高要求。

