[远程/赫尔辛基]诚聘Golang开发工程师

[远程/赫尔辛基]诚聘Golang开发工程师 该公司成立于2004年,是全球领先的RFID测试与测量解决方案提供商,其产品旨在满足实验室和生产现场的日常使用需求。目前,公司正在寻找一名Go开发承包商。

任务:

  • 负责系统变更的动手实施、指导其他开发人员以及整体架构设计

必备条件:

  • 拥有7年以上的专业软件开发经验
  • 乐于指导团队成员并参与重大技术决策
  • 希望构建在工厂和云端7x24小时运行的健壮且可维护的系统
  • 在以下方面拥有丰富经验:
    • Golang
    • 云原生
    • CI / CD
    • 架构设计

感兴趣的工作领域:

  • NodeJS
  • AWS服务:IoT、Lambda、ECR、CDK、API GW、DynamoDB等
  • Linux、Kubernetes
  • API(REST、WS)、MQTT、网络、Protobuf
  • 实时系统和嵌入式系统
  • 时间序列数据、MongoDB
  • 数据管道
  • 机器学习

条件:

  • 开始日期:尽快
  • 预计持续时间:6个月

在此申请


更多关于[远程/赫尔辛基]诚聘Golang开发工程师的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于[远程/赫尔辛基]诚聘Golang开发工程师的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


根据职位描述,这是一个对资深Golang工程师要求较高的远程合约岗位。以下是针对技术要点的专业分析:

核心架构匹配分析:

该职位需要构建7x24小时运行的工业级系统,Golang的并发模型和内存管理非常适合此类场景。以下是关键技术的实现示例:

// 示例:工厂数据采集与云同步的架构核心
package main

import (
    "context"
    "time"
    "github.com/eclipse/paho.mqtt.golang"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/bson"
)

// 实时数据管道处理
type DataPipeline struct {
    mqttClient  mqtt.Client
    mongoClient *mongo.Client
    awsIoT      AWSIoTClient
}

func (dp *DataPipeline) ProcessSensorData(ctx context.Context) {
    // MQTT订阅工厂设备数据
    dp.mqttClient.Subscribe("factory/sensors/#", 1, func(client mqtt.Client, msg mqtt.Message) {
        // Protobuf解码
        var sensorData SensorData
        if err := proto.Unmarshal(msg.Payload(), &sensorData); err != nil {
            // 错误处理
            return
        }
        
        // 时间序列数据存储
        dp.storeTimeSeriesData(ctx, sensorData)
        
        // 实时转发到AWS IoT Core
        dp.awsIoT.Publish(ctx, sensorData)
    })
}

// Kubernetes健康检查端点
func (dp *DataPipeline) HealthCheck() http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
        defer cancel()
        
        // 检查MongoDB连接
        if err := dp.mongoClient.Ping(ctx, nil); err != nil {
            w.WriteHeader(http.StatusServiceUnavailable)
            return
        }
        
        // 检查MQTT连接
        if !dp.mqttClient.IsConnected() {
            w.WriteHeader(http.StatusServiceUnavailable)
            return
        }
        
        w.WriteHeader(http.StatusOK)
    }
}

云原生部署配置示例:

# Kubernetes部署配置
apiVersion: apps/v1
kind: Deployment
metadata:
  name: factory-data-processor
spec:
  replicas: 3
  selector:
    matchLabels:
      app: data-processor
  template:
    metadata:
      labels:
        app: data-processor
    spec:
      containers:
      - name: main
        image: ${ECR_REPO}/data-processor:${TAG}
        ports:
        - containerPort: 8080
        env:
        - name: MQTT_BROKER
          value: "tcp://factory-mqtt:1883"
        - name: MONGODB_URI
          valueFrom:
            secretKeyRef:
              name: db-secrets
              key: mongodb-uri
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
---
# AWS CDK基础设施代码示例(Go版本)
func NewDataPipelineStack(scope constructs.Construct, id string, props *StackProps) awscdk.Stack {
    stack := awscdk.NewStack(scope, &id, props)
    
    // DynamoDB表
    table := awsdynamodb.NewTable(stack, jsii.String("TimeSeriesData"), &awsdynamodb.TableProps{
        PartitionKey: &awsdynamodb.Attribute{
            Name: jsii.String("device_id"),
            Type: awsdynamodb.AttributeType_STRING,
        },
        SortKey: &awsdynamodb.Attribute{
            Name: jsii.String("timestamp"),
            Type: awsdynamodb.AttributeType_NUMBER,
        },
        BillingMode: awsdynamodb.BillingMode_PAY_PER_REQUEST,
    })
    
    // Lambda处理函数
    fn := awslambda.NewFunction(stack, jsii.String("DataProcessor"), &awslambda.FunctionProps{
        Runtime: awslambda.Runtime_GO_1_X(),
        Code:    awslambda.Code_FromAsset(jsii.String("./lambda"), nil),
        Handler: jsii.String("main"),
        Environment: &map[string]*string{
            "DYNAMODB_TABLE": table.TableName(),
        },
    })
    
    table.GrantReadWriteData(fn)
    
    return stack
}

CI/CD流水线关键配置:

# GitLab CI示例
stages:
  - test
  - build
  - deploy

go-test:
  stage: test
  image: golang:1.21
  script:
    - go test -v -race ./...
    - go vet ./...
    - staticcheck ./...

build-multiarch:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - |
      docker buildx build \
        --platform linux/amd64,linux/arm64 \
        -t $ECR_REGISTRY/$IMAGE_NAME:$CI_COMMIT_SHA \
        -t $ECR_REGISTRY/$IMAGE_NAME:latest \
        --push .

deploy-k8s:
  stage: deploy
  image: bitnami/kubectl:latest
  script:
    - kubectl set image deployment/factory-data-processor \
        main=$ECR_REGISTRY/$IMAGE_NAME:$CI_COMMIT_SHA
    - kubectl rollout status deployment/factory-data-processor

实时系统数据处理模式:

// 使用Worker Pool处理高并发传感器数据
type WorkerPool struct {
    workers   int
    taskQueue chan SensorTask
    wg        sync.WaitGroup
}

func (wp *WorkerPool) Start(ctx context.Context) {
    for i := 0; i < wp.workers; i++ {
        wp.wg.Add(1)
        go wp.worker(ctx, i)
    }
}

func (wp *WorkerPool) worker(ctx context.Context, id int) {
    defer wp.wg.Done()
    
    for {
        select {
        case task := <-wp.taskQueue:
            // 处理实时数据
            processed := wp.processTask(task)
            
            // 发布到多个输出通道
            wp.publishToMQTT(processed)
            wp.storeToMongoDB(processed)
            wp.sendToDataPipeline(processed)
            
        case <-ctx.Done():
            return
        }
    }
}

// 使用gRPC流处理实时通信
func (s *DataService) StreamSensorData(stream pb.DataService_StreamSensorDataServer) error {
    for {
        data, err := stream.Recv()
        if err == io.EOF {
            return stream.SendAndClose(&pb.StreamResponse{})
        }
        if err != nil {
            return err
        }
        
        // 实时处理
        result := processRealTimeData(data)
        
        // 可选:流式返回处理结果
        if err := stream.Send(result); err != nil {
            return err
        }
    }
}

该职位需要综合运用Golang在并发处理、系统稳定性、云原生架构方面的优势,构建能够处理工厂实时数据并与云端服务集成的健壮系统。技术栈覆盖了从嵌入式设备通信到云端数据处理的完整链条。

回到顶部