Golang
Condition Il y a 3 entités : utilisateur, chat, message • L'utilisateur a un nom et une date d'inscription • Le chat a un nom et une date de création • Le message a du texte, un auteur et une date de création • Un utilisateur peut être dans plusieurs chats en même temps • Le message appartient obligatoirement à un chat, il ne peut pas appartenir à plus d'un chat en même temps • Il faut décrire le domaine sous forme de tables -- distribué -- message_count dans chats limite 100 --getShard(time zone) -> shard_id -> 1 --getShard(time zone) -> shard_id -> 2 --shard1 [1..100] --shard2 [101..200] CREATE TABLE users ( id int PRIMARY KEY, name varchar(255) NOT NULL, reg_at TIMESTAMP NOT NULL DEFAULT NOW() ); CREATE TABLE chats ( id int PRIMARY KEY, name VARCHAR(255) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT NOW(), message_count int NOT NULL CHECK <= 100 ); CREATE TABLE user_chats ( user_id int not null REFERENCES users(id), chat_id int NOT NULL REFERENCES chats(id), PRIMARY KEY (user_id, chat_id) ); CREATE TABLE messages ( id int PRIMARY KEY, chat_id int NOT NULL REFERENCES chats(id), author_id int NOT NULL REFERENCES users(id), created_at TIMESTAMP NOT NULL DEFAULT NOW(), text TEXT NOT NULL );
Avez-vous actuellement d'autres entretiens ou offres?
Nomme tous les méthodes HTTP (verbes) que vous connaissez.
Sur quoi peut-on se baser lors du choix du nombre de shards pour le cache si la charge n'est pas connue à l'avance?
Comment aviez-vous déployé PostgreSQL ? Parlez-moi de la stabilité et de la scalabilité.
La formalisation via GPH n'apparaît pas dans le livre de travail?
Comment avez-vous effectué la mise à l'échelle des consommateurs Kafka ? Selon quels critères ?
package principal import ( "fmt" "sync" ) func main() { for i := 0; i < 5; i++ { go fmt.Println(i) } }
Est-il préférable de définir l'interface au lieu d'implémentation ou au lieu d'utilisation?
Qu'est-ce que le partitionnement et le sharding ? Les avez-vous utilisés ?
Le service a planté après la connexion de la dixième boutique à la fonctionnalité de statistiques. Que feras-tu ? Comment diagnostiquer et optimiser la base de données ?
Que se passe-t-il en cas de collisions de hachage dans une map ?
Parle-moi de ton expérience chez Tinkoff — comment as-tu été embauché et quelles étaient tes tâches?
Codage en direct : tâche sur les goroutines — accès concurrent aux données partagées, condition de course, solution via mutex. Différence entre sync.Mutex et sync.RWMutex.
Quelle est la différence entre les canaux tamponnés et non tamponnés?
Que cherches-tu actuellement pour toi dans ton nouvel emploi?
Pouvez-vous parler de l'architecture du transformateur?
Dans quelles situations est-il plus approprié qu'un développeur écrive du code manuellement plutôt que de s'appuyer sur des solutions générées par l'IA?
Les mises à jour des documents arrivent au service message Document { string Url = 1; // URL du document, son identifiant unique uint64 PubDate = 2; // heure de publication déclarée du document uint64 FetchTime = 3; // heure de réception de cette mise à jour du document, peut être considérée comme un identifiant de version. La paire (Url, FetchTime) est unique. string Text = 4; // texte du document uint64 FirstFetchTime = 5; // initialement absent, doit être rempli } Les documents peuvent arriver dans n'importe quel ordre (pas dans l'ordre de leur mise à jour), et il peut également y avoir des messages en double. Il est nécessaire de former en sortie des messages identiques, mais avec des champs corrigés selon les règles suivantes (tout ce qui est indiqué ci-dessous concerne un groupe de documents avec le même champ Url): Le champ Text et FetchTime doivent être ceux du document avec le plus grand FetchTime reçu jusqu'à présent. Le champ PubDate doit être celui du message avec le plus petit FetchTime. Le champ FirstFetchTime doit être égal à la valeur minimale de FetchTime. Autrement dit, à chaque instant, nous prenons PubDate et FirstFetchTime du premier version reçu jusqu'à présent (si on les trie par FetchTime), et Text de la dernière. L'interface dans le code peut être implémentée ainsi: type Processor interface { Process(doc *Document) (*Document, error) } Ce code fonctionnera dans un service qui lit des messages d'une file (Kafka ou similaire), et écrit également le résultat dans la file. Si Process retourne Null, rien n'est écrit dans la file.
Connaissez-vous Linux et à quel niveau?