I have a go app on azure that generates SSE connections depending on an id sent in the url as the event source '.co/stream/{id}'. One of those ids has been used more frequently than others and has stopped connecting but any other id connect just fine. The app is in an ubuntu VM.
The client connects with a vue app.
I'm not sure if azure is blocking the url or if there's a limit on connections?
Things I've tried:
Endpoints and ports have been configured in the network config in azure. Restarting the app and server works for a few minutes (5-10 min) but then get an Err_Connection_Refused on the client. Cpu and ram usage is very low on the vm
client
var url = "example.co:3000/";
var streaming = "stream/";
var source = new EventSource(url + streaming + this.$route.params.idCine);
console.log("ready state connecting = " + source.readyState);
source.onmessage = function(event) {
console.log("ready state = " + source.readyState);
console.log('yay');
}
backend connects to a mysql db and generates a json for the client message
package controllers
import (
"github.com/revel/revel"
"cplsAPI/app"
"time"
"fmt"
"strconv"
)
type App struct {
*revel.Controller
}
type Order struct {
IdOrder int` json:"idOrder" `
OrderNum string` json:"orderNum" `
CustomerName string` json:"customerName" `
DeliveryPoint int` json:"deliveryPoint" `
ImageUrl string` json:"imageUrl" `
Timer int` json:"timer" `
Status int` json:"status" `
IdCine int` json:"idCine" `
}
func (c App) Index() revel.Result {
return c.Render()
}
func (c App) GetOrders() revel.Result {
idCine := c.Params.Route.Get("idCine")
sql := "SELECT * FROM Orders WHERE idCine = "+idCine+";"
rows, err := app.DB.Query(sql)
var resul []Order
checkErr(err)
for rows.Next() {
var idOrder int
var orderNum string
var customerName string
var deliveryPoint int
var imageUrl string
var timer int
var status int
var idCine int
var createdAt string
var updatedAt string
err = rows.Scan(&idOrder,&orderNum,&customerName,&deliveryPoint,&imageUrl,&timer,&status,&idCine,&createdAt,&updatedAt)
checkErr(err)
resul = append(resul, Order{IdOrder:idOrder , OrderNum:orderNum , CustomerName:customerName , DeliveryPoint:deliveryPoint , ImageUrl:imageUrl , Timer:timer , Status:status , IdCine:idCine})
// fmt.Printf("%+v
", resul)
}
defer rows.Close()
return c.RenderJSON(resul)
}
func (c App) NewOrder() revel.Result {
idCine := c.Params.Route.Get("idCine")
var jsonData Order
c.Params.BindJSON(&jsonData)
// fmt.Printf("%+v",jsonData)
// fmt.Printf("
")
// fmt.Printf(jsonData.OrderNum)
// fmt.Printf("
")
sql:= fmt.Sprintf("INSERT Orders (orderNum, customerName, deliveryPoint, imageUrl, timer, status, idCine) VALUES('%s', '%s', %d,'%s', %d, %d, %s)",jsonData.OrderNum,jsonData.CustomerName,jsonData.DeliveryPoint,jsonData.ImageUrl,jsonData.Timer,jsonData.Status,idCine)
// fmt.Printf(sql)
// fmt.Printf("
")
// fmt.Printf(idCine)
res, err := app.DB.Exec(sql)
checkErr(err)
// fmt.Printf("=======================
")
//var inserted Order
// fmt.Printf("%+v
",res)
// fmt.Printf("=======================
")
id, err := res.LastInsertId()
checkErr(err)
idCineInt, err := strconv.Atoi(idCine)
jsonData.IdOrder = int(id)
jsonData.IdCine = idCineInt
//id, err := res.LastInsertId()
//checkErr(err)
//fmt.Println(id)
// timerInt, err := strconv.ParseInt(timer,10,32)
checkErr(err)
//defer res.Close()
time.AfterFunc(300*time.Second, func() {
// fmt.Printf("===UPDATE===")
updt := fmt.Sprintf("DELETE FROM Orders WHERE idOrder=%d AND idCine=%s",id,idCine)
rows, err := app.DB.Query(updt)
checkErr(err)
defer rows.Close()
//fmt.Println(rows)
})
data := make(map[string]interface{})
data["error"] = nil
data["data"] = jsonData
return c.RenderJSON(data)
}
func (c App) UpdateOrder() revel.Result {
idCine := c.Params.Route.Get("idCine")
var jsonData Order
c.Params.BindJSON(&jsonData)
idCineInt, err := strconv.Atoi(idCine)
// fmt.Printf("===UPDATE===")
dlt := fmt.Sprintf("DELETE FROM Orders WHERE orderNum='%s' AND idCine=%s",jsonData.OrderNum,idCine)
rows, err := app.DB.Query(dlt)
checkErr(err)
fmt.Println(rows)
//jsonData.IdOrder = int(id)
jsonData.IdCine = idCineInt
defer rows.Close()
data := make(map[string]interface{})
data["error"] = nil
data["data"] = jsonData
return c.RenderJSON(data)
}
func checkErr(err error) {
if err != nil {
panic(err)
}
}