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

5 回复

你好 @Viktoriya_Finagenova

让我们联系并更详细地讨论一下,请通过 Rishabh at plaxonic dot com 与我联系。

谢谢! Rishabh

更多关于Golang远程或赫尔辛基岗位招聘的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好, 希望你一切顺利。

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

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

期待尽快收到你的回复。

此致, Nicole

维多利亚,您好,

如果您仍在寻找合适的人选,我对这个职位很感兴趣,因为您所要求的工作内容完全在我的专业领域之内。

您可以通过以下邮箱联系我:andrewjohnson.56782@gmail.com

祝您一切顺利,拥有美好的一天。

您好 @Viktoriya_Finagenova

我希望能帮助您解决当前的需求。

让我们联系并讨论一下。我可以在短时间内以高效的成本为您提供帮助。请通过 Charlie at cisinlabs dot com 联系我。

期待能尽快帮助您, 谢谢, Charlie

根据招聘要求,这是一个对资深Go开发人员要求较高的远程/赫尔辛基合同制岗位。以下是关键技术点的专业分析:

核心架构需求分析: 该职位需要构建7x24小时运行的工业级系统,结合云原生和嵌入式场景。以下是关键技术的Go实现示例:

// 1. 云原生架构示例(AWS Lambda + API Gateway + DynamoDB)
package main

import (
    "context"
    "encoding/json"
    "log"
    
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/dynamodb"
    "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
)

// RFID设备数据模型
type RFIDDeviceData struct {
    DeviceID  string  `json:"deviceId" dynamodbav:"deviceId"`
    Timestamp int64   `json:"timestamp" dynamodbav:"timestamp"`
    RSSI      float64 `json:"rssi" dynamodbav:"rssi"`
    Phase     float64 `json:"phase" dynamodbav:"phase"`
}

// Lambda处理函数
func handler(ctx context.Context, request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    // 解析MQTT/Protobuf数据
    var data RFIDDeviceData
    if err := json.Unmarshal([]byte(request.Body), &data); err != nil {
        return events.APIGatewayProxyResponse{
            StatusCode: 400,
            Body:       "Invalid data format",
        }, nil
    }
    
    // 存储到DynamoDB
    sess := session.Must(session.NewSession())
    db := dynamodb.New(sess)
    
    item, err := dynamodbattribute.MarshalMap(data)
    if err != nil {
        log.Printf("Failed to marshal data: %v", err)
        return events.APIGatewayProxyResponse{
            StatusCode: 500,
            Body:       "Internal server error",
        }, nil
    }
    
    input := &dynamodb.PutItemInput{
        TableName: aws.String("RFIDTimeSeriesData"),
        Item:      item,
    }
    
    _, err = db.PutItem(input)
    if err != nil {
        log.Printf("DynamoDB error: %v", err)
        return events.APIGatewayProxyResponse{
            StatusCode: 500,
        }, nil
    }
    
    return events.APIGatewayProxyResponse{
        StatusCode: 200,
        Body:       "Data processed successfully",
    }, nil
}

func main() {
    lambda.Start(handler)
}
// 2. 实时数据管道示例(MQTT + Protobuf + 时间序列处理)
package main

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

// Protobuf消息定义(示例)
// message RFIDReading {
//     string device_id = 1;
//     int64 timestamp = 2;
//     double rssi = 3;
//     double phase = 4;
//     repeated double antenna_readings = 5;
// }

type DataPipeline struct {
    mqttClient mqtt.Client
    mongoClient *mongo.Client
    ctx        context.Context
}

func NewDataPipeline(brokerURI, mongoURI string) *DataPipeline {
    // MQTT连接配置
    opts := mqtt.NewClientOptions()
    opts.AddBroker(brokerURI)
    opts.SetClientID("rfid-data-ingestor")
    
    client := mqtt.NewClient(opts)
    if token := client.Connect(); token.Wait() && token.Error() != nil {
        log.Fatal(token.Error())
    }
    
    // MongoDB连接
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    
    mongoClient, err := mongo.Connect(ctx, options.Client().ApplyURI(mongoURI))
    if err != nil {
        log.Fatal(err)
    }
    
    return &DataPipeline{
        mqttClient:  client,
        mongoClient: mongoClient,
        ctx:         context.Background(),
    }
}

func (dp *DataPipeline) Start() {
    // 订阅MQTT主题
    token := dp.mqttClient.Subscribe("rfid/readings/+", 1, dp.messageHandler)
    token.Wait()
    log.Println("Subscribed to RFID topics")
}

func (dp *DataPipeline) messageHandler(client mqtt.Client, msg mqtt.Message) {
    // 解析Protobuf消息
    // var reading pb.RFIDReading
    // if err := proto.Unmarshal(msg.Payload(), &reading); err != nil {
    //     log.Printf("Failed to unmarshal protobuf: %v", err)
    //     return
    // }
    
    // 时间序列数据存储到MongoDB
    collection := dp.mongoClient.Database("rfid").Collection("time_series")
    
    // 创建时间序列集合(如果不存在)
    opts := options.CreateCollection().
        SetTimeSeriesOptions(options.TimeSeries().
            SetTimeField("timestamp").
            SetMetaField("device_id").
            SetGranularity("seconds"))
    
    dp.mongoClient.Database("rfid").CreateCollection(dp.ctx, "time_series", opts)
    
    // 插入数据
    // doc := bson.M{
    //     "device_id": reading.DeviceId,
    //     "timestamp": time.Unix(reading.Timestamp, 0),
    //     "rssi":      reading.Rssi,
    //     "phase":     reading.Phase,
    // }
    
    doc := bson.M{
        "device_id": "example-device",
        "timestamp": time.Now(),
        "rssi":      -45.5,
        "phase":     1.57,
    }
    
    _, err := collection.InsertOne(dp.ctx, doc)
    if err != nil {
        log.Printf("Failed to insert into MongoDB: %v", err)
    }
}

func (dp *DataPipeline) Close() {
    dp.mqttClient.Disconnect(250)
    dp.mongoClient.Disconnect(dp.ctx)
}
// 3. Kubernetes部署配置示例(Go应用容器化)
package main

import (
    "fmt"
    "net/http"
    "os"
    "strconv"
    
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

// Prometheus指标定义
var (
    rfidReadingsTotal = prometheus.NewCounterVec(
        prometheus.CounterOpts{
            Name: "rfid_readings_total",
            Help: "Total number of RFID readings processed",
        },
        []string{"device_id", "status"},
    )
    
    processingDuration = prometheus.NewHistogram(
        prometheus.HistogramOpts{
            Name:    "rfid_processing_duration_seconds",
            Help:    "Time taken to process RFID readings",
            Buckets: prometheus.DefBuckets,
        },
    )
)

func init() {
    prometheus.MustRegister(rfidReadingsTotal)
    prometheus.MustRegister(processingDuration)
}

// 健康检查端点(Kubernetes就绪/存活探针)
func healthHandler(w http.ResponseWriter, r *http.Request) {
    w.WriteHeader(http.StatusOK)
    w.Write([]byte("OK"))
}

// 指标端点
func metricsHandler(w http.ResponseWriter, r *http.Request) {
    promhttp.Handler().ServeHTTP(w, r)
}

// 主服务
type RFIDService struct {
    port int
}

func NewRFIDService() *RFIDService {
    port := 8080
    if envPort := os.Getenv("PORT"); envPort != "" {
        if p, err := strconv.Atoi(envPort); err == nil {
            port = p
        }
    }
    return &RFIDService{port: port}
}

func (s *RFIDService) Start() error {
    http.HandleFunc("/health", healthHandler)
    http.HandleFunc("/metrics", metricsHandler)
    
    // 业务端点
    http.HandleFunc("/api/v1/readings", s.handleReadings)
    
    addr := fmt.Sprintf(":%d", s.port)
    return http.ListenAndServe(addr, nil)
}

func (s *RFIDService) handleReadings(w http.ResponseWriter, r *http.Request) {
    timer := prometheus.NewTimer(processingDuration)
    defer timer.ObserveDuration()
    
    // 处理RFID读数逻辑
    rfidReadingsTotal.WithLabelValues("device-123", "success").Inc()
    
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    w.Write([]byte(`{"status": "processed"}`))
}

func main() {
    service := NewRFIDService()
    if err := service.Start(); err != nil {
        log.Fatal(err)
    }
}

技术栈匹配建议:

  1. 云原生架构:使用Go的AWS SDK(aws-sdk-go)实现Lambda函数、DynamoDB操作和CDK部署
  2. 实时系统:结合MQTT客户端(paho.mqtt.golang)和Protobuf(golang/protobuf)处理嵌入式设备数据
  3. 数据管道:使用Go的并发特性(goroutines + channels)构建高效数据处理流水线
  4. Kubernetes部署:实现健康检查、指标暴露(Prometheus)和配置管理
  5. CI/CD集成:通过Go测试框架和Docker多阶段构建实现自动化部署

这个岗位需要深入理解Go在分布式系统、实时数据处理和云原生架构中的应用,特别是RFID测试测量领域的特殊需求(时间序列数据、嵌入式集成等)。

回到顶部