changeset 2:9cb09adb4740

Enhance server performance with parallelization
author Lewin Bormann <lbo@spheniscida.de>
date Thu, 01 Oct 2020 12:03:33 +0200
parents f9cbcf818af6
children 4207d32497e2
files server/server.go
diffstat 1 files changed, 19 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/server/server.go	Thu Oct 01 11:56:03 2020 +0200
+++ b/server/server.go	Thu Oct 01 12:03:33 2020 +0200
@@ -5,12 +5,12 @@
 	"log"
 	"net"
 	"strconv"
-
-	"golang.org/x/net/dns/dnsmessage"
+	"time"
 
 	rpclog "github.com/dermesser/clusterrpc/log"
 	"github.com/dermesser/clusterrpc/securitymanager"
 	"github.com/dermesser/clusterrpc/server"
+	"golang.org/x/net/dns/dnsmessage"
 )
 
 func extractQueryHost(pkg []byte) (string, error) {
@@ -43,6 +43,7 @@
 type serializer struct {
 	upstream string
 	conn     *net.UDPConn
+	n        int
 
 	reqs chan request
 }
@@ -71,7 +72,7 @@
 			respch <- nil
 			continue
 		}
-		log.Print("Querying:", hosts)
+		log.Println("Serializer", s.n, "querying:", hosts)
 
 		sz, err := s.conn.Write(pkg)
 		if err != nil {
@@ -83,6 +84,7 @@
 			log.Println("Warning: Wrote only", sz, "of", len(pkg), "bytes!")
 		}
 		dst := make([]byte, 1500)
+		s.conn.SetReadDeadline(time.Now().Add(1 * time.Second))
 		sz, err = s.conn.Read(dst)
 		if err != nil {
 			log.Print(err)
@@ -94,15 +96,17 @@
 }
 
 type resolver struct {
-	s *serializer
+	reqs chan request
+	ch   chan []byte
 }
 
 func (r *resolver) handle(c *server.Context) {
 	pkg := c.GetInput()
-
-	ch := make(chan []byte)
-	r.s.reqs <- request{pkg, ch}
-	resp := <-ch
+	if r.ch == nil {
+		r.ch = make(chan []byte)
+	}
+	r.reqs <- request{pkg, r.ch}
+	resp := <-r.ch
 	if resp == nil {
 		c.Fail("Lookup didn't succeed")
 		return
@@ -146,9 +150,13 @@
 		log.Fatal(err)
 	}
 
-	s := &serializer{upstream: *upstream, reqs: make(chan request)}
-	go s.run()
-	r := &resolver{s: s}
+	const numSerializers = 10
+	reqs := make(chan request)
+	for i := 0; i < numSerializers; i++ {
+		s := &serializer{upstream: *upstream, reqs: reqs, n: i}
+		go s.run()
+	}
+	r := &resolver{reqs: reqs}
 	srv.RegisterHandler("DNSOverRPC", "Resolve", r.handle)
 
 	log.Println(srv.Start())