2017-03-01 3 views
1

J'ai une architecture orientée services avec des services de couple.Comment obtenir des données triées d'un service à un autre sur http

  • produit - Liste des magasins de produits

    { id: number, price: number }

  • Catégories - Informations catégorie magasin + la liste des ids produits

    { id: number, parentCategory: number, productIds: number[] }

laisse supposer que je avoir une telle catégorie insta nce

{ 
    id: 1, 
    parentCategory: null, 
    productIds: [1, 3, 4, 5, ....] 
} 

J'ai besoin d'obtenir 10 produits de la catégorie ci-dessus triés par prix du produit.

processus de service Catégorie cette demande et parce qu'il ne sait rien sur le prix, il doit en faire la demande au service de produit comme ça:

/api/products? 
    ids=<list of all product ids> 
    limit=10 
    sortBy=price 

qui ne fonctionne pas bien lorsque la catégorie a beaucoup de produits.

Quelle est la recette dans un tel cas? Merci.

+0

Pourquoi avez-vous besoin de récupérer ces identifiants? Probablement vous ne devriez pas les recevoir de retour? Mais les transmettre à travers le service de produits où ils pourraient être triés et retransmis dans un autre appel de service et non pas comme une réponse dans le bon ordre? Vous devez passer ces identifiants d'une manière ou d'une autre, sinon vous devrez les avoir déjà triés dans le service Catégories, – cassandrad

+0

@cassandrad Non, je ne m'attends pas à recevoir des identifiants triés. Essentiellement, сategory demande de trier une liste prédéfinie d'identifiants de produit (identifiants appartenant à une certaine catégorie) et de renvoyer seulement 10 produits. Et je suis inquiet quand la catégorie, par exemple, aura 1000 identifiants de produits, elle doit tous les envoyer via une requête HTTP. –

+0

Pouvez-vous ajouter un exemple avec des données dans les deux services à votre question, s'il vous plaît? – cassandrad

Répondre

2

Je suis d'accord avec victor - POST demande pourrait résoudre le problème potentiel. Si vous êtes préoccupé par les performances, par exemple, dans le cas de milliers d'identifiants, vous devriez envisager de fusionner ces services ensemble. Ou dupliquez les données de prix dans le service Catégories.

La duplication de données et la fusion de plusieurs services en un pour des raisons de performances sont des situations normales dans l'architecture de microservices. Mais si votre service de produits ne stocke que des informations et n'a aucune logique métier, alors je envisagerais certainement de fusionner.

En outre, considérez que tous les identifiants ont déjà été triés dans le service Catégories. Pour moi, ce serait la meilleure solution dans ce cas si le service Produits ne fera rien d'utile et que seul le tri

1

Vous devez faire en sorte que ce point de terminaison ne reçoive que Http Post, puis vous devez placer tous les identifiants de produit dans le corps de votre requête. Quelque chose comme ceci:

{ "ids": [], (un tableau avec tous vos ids en elle) "limite": 10, "sortBy": "prix" }

pas sûr pourquoi vous avez le champ "limite", je pense que ce qui contrôle la limite est le nombre d'ID que vous passez.

+0

dans mon cas, la catégorie doit toujours envoyer tous les identifiants de produit (il ne sait pas comment les trier) et demander le service de produit trier et retourner seulement 10 produits retour –

+0

ok c'est très bien. Envoyer la demande dans le corps d'un poste Http devrait toujours résoudre votre problème de manquer de place dans l'url. – victor