2015-06-21 33 views
1

我正試圖找到從Scala實時通信到JavaScript的最佳解決方案。
到目前爲止測試過的幾個想法,但由於圖書館必須處理每秒約1000個請求,並不是每個解決方案都是最好的。
下面附上其中一種方法。 if (modulo == 0)聲明需要一些快速的庫來將事件推送到前端。

您對vert.x及其酒館子庫有何看法? https://github.com/vert-x/vertx-examples/tree/master/src/raw/scala/pubsub
這個庫可以處理每秒1000個請求嗎?同樣的問題與此https://github.com/vert-x/vertx-examples/tree/master/src/raw/scala/websockets 我正在嘗試這個推消息庫https://www.scaledrone.com/,但它在開始時失敗(每秒只有10個請求)。

或者我可能期待很多,並且很容易通過簡單的方式實現如此多的請求。我使用的是Redis,它有pub sub協議。所以也許有一些簡單的方法可以在前端將數據從Redis推送到JavaScript?如何在JavaScript和Scala之間實現實時通信

private def checkQueue(r: RedisClient, numbers: List[Int]): Unit = { 
    val d1 = new Date() 
    val format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") 
    val now = new Date() 
    for (nr <- numbers) { 
     val ranges = r.hkeys("user_" + nr + ":soldier:queue_time") 
     ranges match { 
      case Some(ss) => for (range <- ss) { 
       val added_time = r.hget("user_" + nr + ":soldier:queue_time", range) 
       val saved = format.parse(added_time.get) 
       val diff = (now.getTime - saved.getTime)/1000 // diff in sec 
       val interval = r.hget("user_" + nr + ":soldier:interval", range) 
       val modulo = diff % interval.get.toInt 
       if (modulo == 0) { 
        val queue_amount = r.hget("user_" + nr + ":soldier:queue_amount", range) 
        if (queue_amount.get.toInt >= 1) { 
         r.hincrby("user_" + nr + ":soldier:amount", range, 1) 
         r.hincrby("user_" + nr + ":soldier:queue_amount", range, -1) 
        } 
       } 
      } 
      case None => 
     } 
    } 
    val d2 = new Date() 
    println("loop time: " + (d2.getTime - d1.getTime) + " milliseconds") 
} 

回答

2
So maybe there is some easy way to push data from Redis to JavaScript at the frontend? 

檢查Webdis它提供HTTP接口Redis的。包括髮布訂閱功能:

Pub/Sub using Transfer-Encoding: chunked, works with JSONP as well. Webdis can be used as a Comet server. 

您還可以使用播放寫自己CometStream,或Websocket服務器。 你也可以檢查this project獲取靈感。