[远程/赫尔辛基]诚聘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在并发处理、系统稳定性、云原生架构方面的优势,构建能够处理工厂实时数据并与云端服务集成的健壮系统。技术栈覆盖了从嵌入式设备通信到云端数据处理的完整链条。

