I client si connettono a WCF o SQL Server

1

Mi chiedevo quale sia il modo preferito di accedere ai dati da un server in un'applicazione client. I dati verranno archiviati sul server in un database SQL e in precedenza ho utilizzato i seguenti 2 metodi per ottenere i dati:

1) Il client si connette direttamente al database SQL
2) Il client si connette a un servizio Web che esegue la query sql e quindi restituisce i dati.

Il programma in questa istanza verrà scritto in C #, quindi saranno disponibili le seguenti tecnologie:

Entity Framework (connettersi al database sql)
WCF (servizio web)

Dal punto di vista della codifica tutta la logica di accesso ai dati verrà scritta nelle classi di repository indipendentemente dal metodo utilizzato, quindi l'installazione fisica delle connessioni non dovrebbe avere alcun effetto su questo. Ad esempio un repository semplice potrebbe essere:

public interface IUserRepository
{
    IList<User> GetUsers();
}

public SqlUserRepository : IUserRepositoy
{
   private MyDbContext _dbContext;
   public SqlUserRepository(MyDbContext dbContext)
   {
      _dbContext = dbContext;
   }

   public IList<User> GetUsers()
   {
       return _dbContext.Users.ToList();
   }
}

public WcfUserRepository : IUserRepository
{
   IUserRepositoy _userRepository;

   public WcfUserRepository(IUserRepository userRepository)
   {
   }

   [WebGet(UriTemplate = "/users")]
   public IList<User> GetUsers()
   {
      return _userRepository.GetUsers();
   }
}

Quindi in entrambi i casi i client si baseranno solo su IUserRepository .

Il problema che sto avendo è che l'utilizzo di WCF sembra più sicuro, e il livello extra di astrazione rende facile cambiare i provider di database. Tuttavia, quando utilizzo questa soluzione, ho sempre avuto problemi con le prestazioni e grossi problemi se viene restituito un set di dati di grandi dimensioni.

Ad esempio, se ci sono 10.000 utenti nel sistema che utilizzano il framework di entità, questo non è un problema, ma a seconda di come viene configurato WCF ciò può causare un messaggio di errore troppo grande.

Qualche opinione sulle migliori pratiche qui?

In che modo è possibile configurare WCF per ridurre la probabilità di problemi con valori di ritorno elevati?

Ovviamente WCF sarà sempre più lento di SQL diretto in quanto vi è un ulteriore passaggio di negoziazione del messaggio SOAP / REST. Ma può essere ottimizzato fino a un livello accettabile?

    
posta Nick Williams 23.12.2014 - 23:09
fonte

2 risposte

1

Direi che dipende dall'applicazione e dai suoi utenti. Se la sua app aziendale interna localizzata in una sede dell'ufficio che parla direttamente con il db è migliore, in quanto la creazione di un servizio tra l'app e db rende la creazione del software più costosa senza alcun guadagno reale. Se ci sono sedi di filiali fisicamente disconnesse o la tua app è disponibile al di fuori della rete interna della società, un servizio porterà vantaggi come la sicurezza (l'apertura del database SQL al mondo non dovrebbe essere considerata) e il traffico db relativamente chiacchierone su la rete aziendale che è più veloce pur avendo pochi viaggi di andata e ritorno tra il cliente e il servizio.

Il framework Entity in entrambi i casi è il modo in cui si astraggono specifici server DB, anche se in pratica il cambiamento viene raramente eseguito.

Inoltre, in ogni caso dovresti limitare la quantità di dati che ritorna. I suoi utenti improbabili possono lavorare con 10.000 righe su base individuale. Il cercapersone ci aiuterà.

    
risposta data 24.12.2014 - 02:09
fonte
1

In ogni caso, la seconda opzione che hai detto è la scelta migliore: 2) Client's connect to a web service which runs the sql query and then returns the data.

Ci sono molte ragioni per spiegare perché l'accesso al DB dovrebbe essere deviato dal client, ma ecco un elenco di alcune delle considerazioni più importanti:

Sicurezza

  • L'utilizzo di un servizio Web ti consente di filtrare e disinfettare le richieste in arrivo prima di eseguire la query.

  • Accedi alle credenziali direttamente nel database o memorizzato solo all'interno del servizio web e non a ogni singolo client che tenta di accedere al database. Una posizione centrale semplifica notevolmente la manutenzione della sicurezza di routine, come l'aggiornamento delle password e il blocco degli utenti precedenti del sistema.

Amministrazione

  • Quando è necessario aggiornare il database (spostarsi su un altro server, schema, ecc ...), è molto più facile se si deve preoccupare di un singolo punto di connessione invece di un gran numero di punti di connessione distribuiti .

  • L'utilizzo di un servizio fornisce un accoppiamento più flessibile tra i client e il database. Ciò semplifica la scalabilità del database, il numero di client e la modifica dei tipi di client in base alle esigenze.

  • Se i carichi delle query diventano troppo pesanti, è più semplice abilitare la memorizzazione dei dati nella cache all'interno del servizio Web rispetto a quella che si avrebbe nell'ambiente del database.

risposta data 27.12.2014 - 21:20
fonte

Leggi altre domande sui tag