Golang
Existe alguma forma de gerir e ajustar o coletor de lixo stop-the-world em Go?
// tabela de produtos: // ID | cnt_view // ----------- // 1 | 100 // dois utilizadores começaram a ver o produto com id = 1 ao mesmo tempo // e na nossa base de dados foram lançadas 2 transações em paralelo // qual será o resultado? postgresql func IncrementView(ctx context.Context, db *sql.DB, id int64) error { tx, err := db.BeginTx(ctx, nil) if err != nil { return err } defer tx.Rollback() var cnt int err = tx.QueryRowContext(ctx, "SELECT cnt_view FROM goods WHERE id = $1", id, ).Scan(&cnt) if err != nil { return err } cnt++ _, err = tx.ExecContext(ctx, "UPDATE goods SET cnt_view = $1 WHERE id = $2", cnt, id, ) if err != nil { return err } return tx.Commit() }
Já teve que lidar com tarefas arquitetónicas? Como foram tomadas as decisões arquitetónicas?
Por que precisamos interromper o contexto na estrutura? Por que terminar os trabalhadores? Queremos interromper o método Stop.
Por que está atualmente à procura de um novo emprego? O que não gosta no seu atual emprego?
Para onde vão as goroutines ao serem criadas — para a fila local ou global do agendador Go?
Como você realizou a escalabilidade dos consumidores Kafka? Com base em quais critérios?
[nome] perguntou: conte-me sobre as primitivas de sincronização em GoLang.
De que forma os tempos de espera influenciam a redução da carga na análise?
O que é VACUUM no PostgreSQL?
Qual foi o projeto na empresa? Que microserviço havia lá?
Índices no PostgreSQL: o que são, que tipos conhece, por que o B-tree é melhor que Hash?
É possível escrever numa mesma map a partir de diferentes goroutines ao mesmo tempo? O que acontecerá?
O que é a Load Average, como verificá-la e a que deve prestar atenção?
O que será importante para ti ao escolher um novo local de trabalho?
Como influenciou a mudança do processo com análise?
Como lidou com a situação em que as contas durante as transferências eram atribuídas a diferentes shards?
Como converter um número para o sistema binário?
tipo Response interface{} tipo Backend interface { Invoke(ctx context.Context, req Request) (Response, error) } var _ Backend = &BackendImpl{} // addr contém ip:porta de uma instância específica func NewBackend(addr string) *BackendImpl type Balancer struct { // TODO backends []*BackendImpl index int mu sync.Mutex } var _ Backend = &Balancer{} func (b *Balancer) Invoke(ctx context.Context, req Request) (Response, error) { se len(b.backends) == 0 { return nil, fmt.Errorf("O número de backends no slice é 0") } b.mu.Lock() index := b.index se b.index + 1 == len(b.backends) { b.index = 0 index = 0 } b.mu.Unlock() resp, err := b.backends[index].Invoke(ctx, req) return resp, err } // addrs contém os endereços de todas as instâncias balanceadas func NewBalancer(addrs []string) *Balancer { // TODO backends := make([]*BackendImpl, len(addrs))
Como otimizaste as consultas na prática? O que olhas quando a mão fica lenta?