Problema relativo alle prestazioni di blocco ottimistiche

3

Sto progettando un sistema che come la maggior parte delle applicazioni social ha post, le persone possono apprezzare i post e commentarli. Inoltre, come la maggior parte delle applicazioni, gli utenti possono vedere quanti like / commenti hanno ricevuto un post.

Il problema è che per mostrare questi numeri dovrei contare tutti i Mi piace e i commenti ogni volta che un post viene caricato o mantenere i contatori nei post.

Penso che il conteggio dei Mi piace e dei commenti ogni volta sia una cattiva prestazione, quindi ho deciso di adottare la seconda soluzione. Ma perché ora i post devono memorizzare i contatori, ogni volta che a qualcuno piace un post, la versione dovrà essere aggiornata.

Sono preoccupato che, poiché più persone possono interagire con un post in una sola volta, l'eventualità di OptimisticLockingExcpetions può essere elevata e infastidire i miei utenti.

Cosa ne pensate?

    
posta Lucas Piske 27.02.2017 - 01:19
fonte

2 risposte

2

Hai ragione - ciò avverrà. Ma penso che tu non abbia bisogno di un blocco ottimistico per i post. AFAICT, i social network consentono all'utente di modificare il contenuto generato solo dal proprietario / poster. Pertanto i conflitti di scrittura non dovrebbero essere un problema reale. Puoi disabilitare il blocco per tali entità.

Per ottenere il contatore corretto, conta nuovamente con ogni like / dislike invece di incrementare / decrementare il contatore:

UPDATE posts SET nLikes = (SELECT COUNT(*) FROM likes_posts WHERE post_id = :postId) WHERE id = :postId
    
risposta data 27.02.2017 - 01:28
fonte
0

Crea una classe di servizio che è un singleton che tiene traccia dei Mi piace nei post, nei commenti. Lavare periodicamente i dati nel database.

class LikeService {
   // format: <pk, nlikes>
   HashMap<Integer, Integer> cachePostLikes = new HashMap<Integer,Integer>();  
   HashMap<Integer, Integer> cacheCommentLikes = new HashMap<Integer,Integer>(); 
   HashMap<Integer, Integer> dbPostLikes = new HashMap<Integer,Integer>();  
   HashMap<Integer, Integer> dbPostLikes = new HashMap<Integer,Integer>();  


  void incrementPostLikes() {}
  void incrementCommentLikes() {}

  Long getPostLikes(Integer postId) {
      if(!cachePostLikes.containsKey(postId)) {
          // load from db
      }
      return cachePostLikes.get(postId) + dbPostLikes.get(postId)
  }
  Long getCommentLikes(Integer commentId) {}

  // Always reset counts in cache hashmaps to zero
  void flushToDB() {}
}
    
risposta data 27.02.2017 - 01:49
fonte

Leggi altre domande sui tag