高级Golang远程工程师(后端/数据处理)职位讨论
高级Golang远程工程师(后端/数据处理)职位讨论 Vaayu 的使命是通过帮助品牌(从时尚、美容到消费品、健康及其他领域)实时跟踪、削减并可靠地传达其气候影响,以实现零售业的脱碳。我们基于科学的平台提供精细、自动化且准确的碳排放计算,其背后由超过 60 万个基于活动的数据点驱动,使品牌能够轻松了解其排放情况,并在整个价值链中采取行动以实现减排目标。
我们正在寻找一位经验丰富的 Golang 后端工程师,需精通关系型和非关系型数据库,并对数据工程有浓厚兴趣。 在此职位中,您将从头开始设计和构建高性能、可扩展的后端服务与数据基础设施,最终目标是为数据科学和分析提供干净的数据集。
如果您希望在一家目标驱动的初创公司工作,并成为定义最先进技术以大规模减少碳排放的团队一员,Vaayu 可能是您职业生涯下一步的理想选择。
您的日常工作将包括什么?
- 从头开始设计、实施和维护可扩展的后端服务和数据管道,并拥有高度的自主权;
- 与生命周期评估专家、数据科学家和后端工程师合作,解决数据挑战;
- 通过选择合适的技术,从基于 Google Cloud Platform 的系统中提取和转换数据,形成相关的结构;
- 与工程团队紧密合作,处理数据预处理、数据结构和服务集成;
我们正在寻找的人才
- 拥有多年 Golang 生产环境经验;
- 在关系型和非关系型数据库方面拥有丰富经验(例如 PostgreSQL、BigQuery);
- 能够有效设计性能良好的数据模型,并优化查询以访问这些模型;
- 对数据工程有浓厚兴趣,并渴望快速学习和理解新技术——具备大数据技术和大型分析系统经验者优先;
- 对解决气候变化问题抱有积极主动的热情;
- 英语流利。
我们提供什么
- 在一家由可持续发展专家领导的使命驱动型初创公司工作
- 获得一家快速发展、前景广阔的公司的股权
- 完全远程工作,地点可在欧洲或同等时区的任何地方
- 与一个多元化、思想开放且国际化的团队合作
- 参加我们每半年一次的线下聚会,在欧洲某个目的地相聚
请注意,这是一个完全远程的全职工作机会。
更多关于高级Golang远程工程师(后端/数据处理)职位讨论的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你好 @tamas_szorcsik 我已经给你发了私信,请查收。 谢谢
更多关于高级Golang远程工程师(后端/数据处理)职位讨论的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好,
我很乐意为你提供帮助。
如需进一步详细讨论,请通过电子邮件 lauren@cisinlabs.com 或 Skype(账号:live:lauren_8606)与我联系。
期待你的回复。
谢谢, Lauren W.
您好 @tamas_szorcsik,
我已经了解了您的需求,并且很乐意为您提供 Golang 方面的支持。
我拥有一支 Golang 专家团队,可以协助您处理持续性的任务。
请通过 Rishabh@plaxonic.com 与我联系,以便我们可以更详细地讨论此事。
此致, Rishabh
这是一个非常吸引人的职位,尤其对于希望在Golang和数据工程交叉领域深耕的资深工程师。Vaayu的技术栈和使命与Go语言的优势高度契合。以下从技术角度分析这个职位可能涉及的核心工作,并给出一些Go代码示例,说明如何构建相关服务。
技术栈分析与Go的实现优势
职位描述强调高性能、可扩展的后端服务和数据管道,这正是Go的强项。其并发模型(goroutines, channels)和高效的运行时,非常适合处理来自60多万个数据点的数据流和实时计算。
1. 数据管道 (Data Pipelines)
使用Go构建并发数据管道,从GCP服务(如Pub/Sub, Cloud Storage)提取数据,进行转换,并加载到BigQuery或PostgreSQL中。
package main
import (
"context"
"encoding/json"
"log"
"cloud.google.com/go/pubsub"
"cloud.google.com/go/bigquery"
)
// 定义从Pub/Sub接收的数据结构
type EmissionEvent struct {
ProductID string `json:"product_id"`
Activity string `json:"activity"`
CO2e float64 `json:"co2e"`
Timestamp string `json:"timestamp"`
}
// 处理消息的函数
func processMessage(ctx context.Context, msg *pubsub.Message) {
var event EmissionEvent
if err := json.Unmarshal(msg.Data, &event); err != nil {
log.Printf("Failed to unmarshal message: %v", err)
msg.Nack() // 通知Pub/Sub稍后重试
return
}
// 在这里进行数据清洗、转换或富化
transformedEvent := transformEvent(event)
// 写入BigQuery
if err := insertIntoBigQuery(ctx, transformedEvent); err != nil {
log.Printf("Failed to insert into BigQuery: %v", err)
msg.Nack()
return
}
log.Printf("Processed event for product: %s", event.ProductID)
msg.Ack() // 成功处理,确认消息
}
func transformEvent(event EmissionEvent) EmissionEvent {
// 示例转换:将活动类型标准化
// 这里可以添加复杂的业务逻辑,如调用外部API获取补充数据
if event.Activity == "shipping_air" {
event.Activity = "transportation_air_freight"
}
return event
}
func insertIntoBigQuery(ctx context.Context, event EmissionEvent) error {
// 初始化BigQuery客户端和插入操作
// client, err := bigquery.NewClient(ctx, "your-project-id")
// inserter := client.Dataset("emissions").Table("events").Inserter()
// return inserter.Put(ctx, []*EmissionEvent{&event})
return nil // 示例占位符
}
func main() {
ctx := context.Background()
// 初始化Pub/Sub订阅者客户端
// client, err := pubsub.NewClient(ctx, "your-project-id")
// sub := client.Subscription("your-subscription-id")
// 使用goroutines并发处理消息
// err = sub.Receive(ctx, func(ctx context.Context, msg *pubsub.Message) {
// go processMessage(ctx, msg) // 为每条消息启动一个goroutine
// })
}
2. 高性能API服务
为前端或数据科学团队提供清洁数据的API端点。使用gin或echo这类高性能框架。
package main
import (
"net/http"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
_ "gorm.io/driver/postgres"
)
type ProductEmission struct {
gorm.Model
ProductID string `json:"product_id"`
TotalCO2e float64 `json:"total_co2e"`
Category string `json:"category"`
}
var db *gorm.DB
func main() {
// 初始化数据库连接 (PostgreSQL)
// dsn := "host=... user=... password=... dbname=... port=... sslmode=..."
// db, _ = gorm.Open(postgres.Open(dsn), &gorm.Config{})
r := gin.Default()
// 为数据科学团队提供聚合数据的API
r.GET("/api/v1/analytics/emissions", getEmissionsSummary)
r.GET("/api/v1/products/:id/breakdown", getProductBreakdown)
r.Run(":8080")
}
func getEmissionsSummary(c *gin.Context) {
var results []struct {
Category string `json:"category"`
TotalCO2e float64 `json:"total_co2e"`
}
// 使用GORM执行复杂的聚合查询
db.Model(&ProductEmission{}).
Select("category, SUM(total_co2e) as total_co2e").
Group("category").
Scan(&results)
c.JSON(http.StatusOK, gin.H{"data": results})
}
func getProductBreakdown(c *gin.Context) {
productID := c.Param("id")
var emissions []ProductEmission
// 从PostgreSQL查询
db.Where("product_id = ?", productID).Find(&emissions)
c.JSON(http.StatusOK, gin.H{"product_id": productID, "breakdown": emissions})
}
3. 数据模型与查询优化
职位要求能设计性能良好的数据模型。在Go中,可以使用结构体标签来定义ORM映射或BigQuery模式。
// 为PostgreSQL设计的GORM模型,包含索引以提高查询速度
type SupplyChainActivity struct {
ID uint `gorm:"primaryKey"`
ProductID string `gorm:"index:idx_product_activity"` // 复合索引
ActivityID string `gorm:"index:idx_product_activity"`
EmissionFactor float64 `json:"emission_factor"`
Quantity float64 `json:"quantity"`
CalculatedCO2e float64 `json:"calculated_co2e"`
// 使用GORM钩子在保存前计算CO2e
BeforeSave(tx *gorm.DB) error {
t.CalculatedCO2e = t.EmissionFactor * t.Quantity
return nil
}
}
// 为BigQuery流式插入设计的结构体
type BQActivityRecord struct {
ProductID string `bigquery:"product_id"`
Activity string `bigquery:"activity"`
EmissionFactor float64 `bigquery:"emission_factor"`
Quantity float64 `bigquery:"quantity"`
CalculatedCO2e float64 `bigquery:"calculated_co2e"`
InsertID string `bigquery:"insert_id"` // 用于去重
}
关键挑战与Go的应对
- 实时计算:品牌需要实时跟踪影响。Go的goroutine可以并行处理成千上万个产品的排放计算。
- 数据准确性:平台基于科学。Go的强类型系统和测试框架(如
testing包)有助于构建可靠、无错误的计算引擎。 - 与GCP集成:Go对Google Cloud有原生且成熟的支持库(
cloud.google.com/go),访问BigQuery、Pub/Sub、Cloud Tasks等服务非常高效。 - 服务集成:需要与数据科学团队的服务(可能是Python)集成。Go可以轻松构建gRPC服务或RESTful API来提供清洁数据。
这个职位是典型的“Go语言+云原生+数据工程”组合,技术挑战性强,且具有积极的社会影响力。候选人需要展示出使用Go构建并发系统、优化数据库查询以及与云平台深度集实的生产级经验。

