Sobes.tech

Golang

/* Precisamos transferir dados de uma fonte para um consumidor. A fonte fornece os dados em pequenos lotes (~dez registos), enquanto que o consumidor funciona melhor com lotes maiores (~mil registos). Um exemplo real é a transferência de dados de filas tipo Kafka para uma base de dados Clickhouse. Fonte: - Praticamente infinita. - A fonte nunca devolve mais de MaxItems registos numa chamada a Next. - Dentro de uma "sessão" (uma chamada à função Pipe), a fonte devolve dados novos em cada chamada a Next. - No entanto, após reiniciar, a fonte começa na posição "confirmada" anterior, indicada por cookie. Portanto, *cada* valor de cookie devolvido por Next, após guardar os dados no receptor, deve ser confirmado com a chamada a Commit, na mesma ordem em que foram devolvidos por Next. Receptor: - Não pode processar mais de MaxItems de cada vez. Nível básico: É necessário implementar a função func Pipe(p Producer, c Consumer) error que lê dados da fonte, os agrupa num buffer de tamanho não superior a MaxItems e os guarda no receptor, depois de o fazer, confirma o progresso na fonte. Dificuldade adicional: Os métodos Next, Process e Commit estão relacionados com chamadas de rede e podem demorar bastante. Para acelerar o processo, é necessário paralelizar os processos de leitura, escrita e confirmação de progresso. De modo que, durante Process ou Commit, a leitura da fonte e a formação do novo buffer continuem. */ const MaxItems = 9999 type Producer interface { // Next devolve: // - um lote de itens para processar // - uma cookie para confirmar quando o processamento estiver concluído // - um erro Next() (items []any, cookie int, err error) // Commit é usado para marcar um lote de dados como processado Commit(cookie int) error } type Consumer interface { Process(items []any) error } func Pipe(p Producer, c Consumer) error { // TODO }

213

Explica o princípio da inversão de dependências e por que a chamada direta aos métodos do repositório a partir de um caso de uso viola o SOLID.

212

Como você realizou o teste e a verificação da correção das solicitações realizadas?

Junior — Middle
211

Dada uma função que aceita duas sequências ordenadas de números inteiros em ordem não decrescente. É necessário retornar todos os elementos da primeira sequência que não estão na segunda. Como você abordaria a solução e qual é a complexidade?

210

Como é que o JWT verifica a sua autenticidade? Como é que se garante que o token não foi falsificado?

210

/* Existe uma aplicação com arquitetura de microserviços. Um microserviço pode ser abstraído através de uma interface Backend. Para aceder a uma instância do microserviço, pode usar o tipo BackendImpl, que já está implementado. Cada microserviço tem várias dezenas de instâncias em execução, cada uma acessível pelo seu próprio endereço addr. No entanto, as instâncias individuais do microserviço não são confiáveis: podem falhar, estar inacessíveis ou sobrecarregadas. Por isso, precisa implementar o tipo Balancer, que também implementa a interface Backend e realiza balanceamento de carga do lado do cliente entre as instâncias do microserviço, escolhendo a cada vez a instância **menos carregada**. */ type Request interface{} type Response interface{} type 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 } var _ Backend = &Balancer{} // addrs contêm os endereços de todas as instâncias balanceadas func NewBalancer(addrs []string) *Balancer { // TODO }

209

Quais são as diferenças entre os ambientes local, dev, stage, prod?

209

Tem experiência em gestão de equipas?

208

O que é adicionado à resposta quando a janela se torna válida?

207

Qual é a limitação de um semáforo e de um canal com buffer como soluções para limitar solicitações paralelas?

206

/* Existe uma aplicação com arquitetura de microserviços. Um microserviço pode ser abstraído através de uma interface Backend. Para aceder a uma instância do microserviço, pode usar o tipo BackendImpl, que já está implementado. Cada microserviço tem várias dezenas de instâncias em execução, cada uma acessível pelo seu próprio endereço addr. No entanto, as instâncias individuais do microserviço não são confiáveis: podem falhar, estar inacessíveis ou sobrecarregadas. Por isso, precisa de implementar um tipo Balancer, que também implementa a interface Backend e realiza balanceamento de carga do lado do cliente entre as instâncias do microserviço, escolhendo sempre a instância **menos carregada**. */

204

Qual é o número máximo de solicitações por segundo (RPS) que o serviço mais carregado processou?

204

Formato de trabalho: remoto, no escritório ou híbrido?

203

O que é um token JWT? Do que é composto?

203

Escrever uma questão na linguagem Go — secção prática (problemas do dia a dia do desenvolvedor, sem algoritmos): melhorar ou corrigir um serviço. Duração — 1,5 horas.

202

Como tornar a memória constante (eliminar a dependência do número de caracteres únicos)?

201

Como será a interação entre o cliente, o microserviço de autorização e o microserviço da loja ao usar JWT? E o que mudará sem JWT, com sessões?

201

Fala sobre a tua experiência de trabalho e o que estás a fazer.

201
/11