Golang开发工程师招聘-全职(莫斯科,新西伯利亚)

Golang开发工程师招聘-全职(莫斯科,新西伯利亚) 诚邀精通Golang的开发者加入我们的团队,您将积极参与现有产品的维护,以及新项目、自有服务和集成方案的开发。

要求具备一年以上商业开发经验!

工作地点为办公室!

关于我们:VFM技术公司是一家IT企业,致力于开发企业管理资源和自雇人士的解决方案。应用领域包括:WFM(劳动力管理)、ERP(企业资源规划)。我们的产品是“杰姆工作”。

您将负责解决以下任务:

  • 编写遵循整洁架构原则的、清晰且易于维护的代码
  • 开发微服务架构
  • 优化服务间通信

我们的技术栈:

  • 工具:Golang, Postgres, Kafka, Redis, Docker, Kubernetes
  • 传输:gRPC/Protobuf, HTTP
  • 部署:Gitlab CI/CD

必备技能:

  • 两年以上后端开发经验
  • 一年以上Golang开发经验
  • 具备微服务架构设计和服务间集成经验
  • 了解设计模式及其在Golang中的应用特点

具备以下条件者优先:

  • 有使用追踪工具的经验
  • 有使用ClickHouse的经验
  • 有使用Grafana、Prometheus、Sentry的经验
  • 掌握DevOps实践(Gitlab CI流水线)

我们提供:

  • 薪资面议
  • 办公室工作(地址:莫斯科市,特维尔大街16号,3号楼)
  • 我们提供您选择的设备
  • 午餐补贴

期待您的反馈!

联系方式:

电话:8 800 222 9898 转 711

Telegram:@wfmtRu

电子邮件:a.antonovich@wfmt.ru


更多关于Golang开发工程师招聘-全职(莫斯科,新西伯利亚)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

5 回复

你好

已发送邮件,请查收。

此致, Ron

更多关于Golang开发工程师招聘-全职(莫斯科,新西伯利亚)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好, 希望你一切顺利。

我可以协助你完成你的需求。

如需进一步详细讨论,请通过电子邮件联系我:nicole.c(at)talentsfromindia(dot)com

期待尽快收到你的回复。 诚挚地, Nicole Skype 联系我:nicole_15269

我认为实际上你们中没有人花时间去真正翻译这个招聘信息,只是因为它发布在 #jobs 板块就回复了……

他们要求人在莫斯科现场办公。我不认为一个加拿大人或者邮箱地址是“talentsinindia”的人能满足这个要求。

说实话……总是有那两条帖子,就在招聘信息发布几分钟后……我倾向于将来把这些标记为垃圾信息,正如这个帖子所证明的,它们除了是垃圾信息什么也不是。

你好, (https://golang-master.herokuapp.com)

我是一名拥有8年经验的Golang/区块链开发人员,对编写简洁、高效的代码充满热情。在数据结构、软件架构和系统设计方面技能突出。

过往项目:

背景与专业技能:

  • 在一个拥有100多名开发人员的大型、高吞吐量交易平台上,开发并维护了Golang微服务。
  • 为微服务文件创建Docker镜像,以便使用Kubernetes编排应用程序。
  • 利用Go的通道(channel)和协程(goroutine)实现RESTful API,连接前端应用与后端服务。
  • 使用API Gateway、Lambda和Dynamo DB实现了“无服务器”架构,并从Amazon S3存储桶部署AWS Lambda代码。
  • 创建了Lambda部署函数,并将其配置为接收来自S3存储桶的事件。
  • 精通应用开发中涉及的关系型和非关系型(NoSQL)数据库。
  • 熟悉使用Golang驱动程序执行CRUD操作,并使用PostgreSQL和SQL Server编写查询。
  • 具有使用Redis内存数据存储进行缓存的经验。

我现在就可以开始工作,周一至周五的工作时间均可工作,可以全职(每周40小时)。期待与您讨论这份工作。

此致,敬礼!

这是一个典型的Golang后端开发职位,专注于微服务架构和企业级应用开发。从技术栈和要求来看,这是一个对Golang实践有较高要求的岗位。

技术栈分析:

  • 核心语言:Golang,要求一年以上商业经验
  • 数据存储:Postgres(主数据库)、Redis(缓存)、ClickHouse(优先,用于分析)
  • 消息队列:Kafka(服务间通信)
  • 部署运维:Docker、Kubernetes、Gitlab CI/CD
  • 监控追踪:Grafana、Prometheus、Sentry(优先)

代码示例(符合职位要求的Golang微服务片段):

// 使用整洁架构的示例结构
package main

import (
    "context"
    "log"
    
    "github.com/gin-gonic/gin"
    "google.golang.org/grpc"
)

// 领域层 - 核心业务逻辑
type UserService interface {
    GetUser(ctx context.Context, id string) (*User, error)
}

// 基础设施层 - 外部依赖实现
type PostgresUserRepository struct {
    db *sql.DB
}

func (r *PostgresUserRepository) FindByID(ctx context.Context, id string) (*User, error) {
    // 数据库查询实现
    query := `SELECT id, name, email FROM users WHERE id = $1`
    row := r.db.QueryRowContext(ctx, query, id)
    
    var user User
    if err := row.Scan(&user.ID, &user.Name, &user.Email); err != nil {
        return nil, err
    }
    return &user, nil
}

// 传输层 - gRPC处理
type UserGRPCServer struct {
    service UserService
}

func (s *UserGRPCServer) GetUser(ctx context.Context, req *pb.GetUserRequest) (*pb.UserResponse, error) {
    user, err := s.service.GetUser(ctx, req.Id)
    if err != nil {
        return nil, status.Errorf(codes.NotFound, "user not found")
    }
    
    return &pb.UserResponse{
        Id:    user.ID,
        Name:  user.Name,
        Email: user.Email,
    }, nil
}

// 传输层 - HTTP处理(支持双协议)
type UserHTTPHandler struct {
    service UserService
}

func (h *UserHTTPHandler) GetUser(c *gin.Context) {
    id := c.Param("id")
    
    user, err := h.service.GetUser(c.Request.Context(), id)
    if err != nil {
        c.JSON(404, gin.H{"error": "user not found"})
        return
    }
    
    c.JSON(200, user)
}

// Kafka消费者示例
func StartKafkaConsumer(ctx context.Context, brokers []string, topic string) {
    config := sarama.NewConfig()
    config.Consumer.Return.Errors = true
    
    consumer, err := sarama.NewConsumer(brokers, config)
    if err != nil {
        log.Fatal("Failed to create consumer:", err)
    }
    
    partitionConsumer, err := consumer.ConsumePartition(topic, 0, sarama.OffsetNewest)
    if err != nil {
        log.Fatal("Failed to consume partition:", err)
    }
    
    defer partitionConsumer.Close()
    
    for {
        select {
        case msg := <-partitionConsumer.Messages():
            processMessage(msg)
        case err := <-partitionConsumer.Errors():
            log.Printf("Kafka error: %v", err)
        case <-ctx.Done():
            return
        }
    }
}

// Redis缓存示例
type CacheService struct {
    client *redis.Client
}

func (s *CacheService) GetUser(ctx context.Context, id string) (*User, error) {
    cacheKey := fmt.Sprintf("user:%s", id)
    
    // 尝试从缓存获取
    data, err := s.client.Get(ctx, cacheKey).Result()
    if err == nil {
        var user User
        if err := json.Unmarshal([]byte(data), &user); err == nil {
            return &user, nil
        }
    }
    
    // 缓存未命中,从数据库获取
    user, err := s.userRepo.FindByID(ctx, id)
    if err != nil {
        return nil, err
    }
    
    // 写入缓存
    userJSON, _ := json.Marshal(user)
    s.client.Set(ctx, cacheKey, userJSON, time.Hour)
    
    return user, nil
}

// Prometheus指标示例
var (
    httpRequestsTotal = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "http_requests_total",
            Help: "Total HTTP requests",
        },
        []string{"method", "endpoint", "status"},
    )
    
    requestDuration = prometheus.NewHistogramVec(
        prometheus.HistogramOpts{
            Name:    "http_request_duration_seconds",
            Help:    "HTTP request duration",
            Buckets: prometheus.DefBuckets,
        },
        []string{"method", "endpoint"},
    )
)

func init() {
    prometheus.MustRegister(httpRequestsTotal)
    prometheus.MustRegister(requestDuration)
}

// 中间件记录指标
func MetricsMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        start := time.Now()
        
        c.Next()
        
        duration := time.Since(start).Seconds()
        status := fmt.Sprintf("%d", c.Writer.Status())
        
        httpRequestsTotal.WithLabelValues(
            c.Request.Method,
            c.Request.URL.Path,
            status,
        ).Inc()
        
        requestDuration.WithLabelValues(
            c.Request.Method,
            c.Request.URL.Path,
        ).Observe(duration)
    }
}

职位关键点:

  1. 架构要求:整洁架构、微服务设计
  2. 通信协议:gRPC/Protobuf为主,HTTP为辅
  3. 运维技能:需要了解完整的CI/CD流水线和监控体系
  4. 数据库:关系型+缓存+时序/分析数据库组合

这个职位适合有Golang微服务实战经验的开发者,技术栈全面,涉及从开发到部署监控的全流程。

回到顶部