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
你好
已发送邮件,请查收。
此致, Ron
更多关于Golang开发工程师招聘-全职(莫斯科,新西伯利亚)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好, 希望你一切顺利。
我可以协助你完成你的需求。
如需进一步详细讨论,请通过电子邮件联系我:nicole.c(at)talentsfromindia(dot)com
期待尽快收到你的回复。 诚挚地, Nicole Skype 联系我:nicole_15269
我认为实际上你们中没有人花时间去真正翻译这个招聘信息,只是因为它发布在 #jobs 板块就回复了……
他们要求人在莫斯科现场办公。我不认为一个加拿大人或者邮箱地址是“talentsinindia”的人能满足这个要求。
说实话……总是有那两条帖子,就在招聘信息发布几分钟后……我倾向于将来把这些标记为垃圾信息,正如这个帖子所证明的,它们除了是垃圾信息什么也不是。
这是一个典型的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)
}
}
职位关键点:
- 架构要求:整洁架构、微服务设计
- 通信协议:gRPC/Protobuf为主,HTTP为辅
- 运维技能:需要了解完整的CI/CD流水线和监控体系
- 数据库:关系型+缓存+时序/分析数据库组合
这个职位适合有Golang微服务实战经验的开发者,技术栈全面,涉及从开发到部署监控的全流程。


