fixes, add k6 script
This commit is contained in:
parent
fdef1a9688
commit
e71d875687
4 changed files with 95 additions and 23 deletions
|
|
@ -79,7 +79,7 @@ func (manager *SocketManager) dispatch(event SocketEvent) {
|
||||||
fmt.Printf("dispatched event: %s\n", event.Type)
|
fmt.Printf("dispatched event: %s\n", event.Type)
|
||||||
return
|
return
|
||||||
case <-time.After(5 * time.Second):
|
case <-time.After(5 * time.Second):
|
||||||
fmt.Printf("havent dispatched event after 5s, chan blocked: %s\n", event.Type)
|
fmt.Printf("havent dispatched listener event after 5s, chan blocked: %s\n", event.Type)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
|
||||||
58
examples/ws-example/k6.js
Normal file
58
examples/ws-example/k6.js
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
import ws from 'k6/ws';
|
||||||
|
import { check } from 'k6';
|
||||||
|
import { sleep } from 'k6';
|
||||||
|
|
||||||
|
export let options = {
|
||||||
|
vus: 1000, // Number of users
|
||||||
|
duration: '10m', // Total duration of the test
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function generateRandomString(length) {
|
||||||
|
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||||
|
let result = '';
|
||||||
|
for (let i = 0; i < length; i++) {
|
||||||
|
result += characters.charAt(Math.floor(Math.random() * characters.length));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function () {
|
||||||
|
let sessionId = generateRandomString(20);
|
||||||
|
const url = 'ws://localhost:3000/ws?sessionId=' + sessionId;
|
||||||
|
|
||||||
|
const response = ws.connect(url, null, function (socket) {
|
||||||
|
// Check if the connection was successful
|
||||||
|
check(socket, { 'connected successfully': (s) => s.readyState === 1 });
|
||||||
|
|
||||||
|
// Event listener for when the WebSocket is open
|
||||||
|
socket.on('open', () => {
|
||||||
|
console.log('Connected to WebSocket');
|
||||||
|
while (true) {
|
||||||
|
socket.send(JSON.stringify({ message: 'ping' }));
|
||||||
|
sleep(1); // Wait for 1 second before sending the next message
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// Event listener for incoming messages
|
||||||
|
socket.on('message', (msg) => {
|
||||||
|
console.log(`Received message: ${msg}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Event listener for errors
|
||||||
|
socket.on('error', (e) => {
|
||||||
|
console.error('Error in WebSocket connection:', e);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Event listener for close
|
||||||
|
socket.on('close', () => {
|
||||||
|
console.log('Disconnected from WebSocket');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check if the WebSocket handshake was successful
|
||||||
|
check(response, { 'status is 101 (Switching Protocols)': (r) => r && r.status === 101 });
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -66,7 +66,7 @@ func (manager *SocketManager) Metrics() ManagerMetrics {
|
||||||
count := manager.goroutinesRunning.Load()
|
count := manager.goroutinesRunning.Load()
|
||||||
metrics := ManagerMetrics{
|
metrics := ManagerMetrics{
|
||||||
RunningGoroutines: count,
|
RunningGoroutines: count,
|
||||||
TotalSockets: manager.sockets.Size(),
|
TotalSockets: 0,
|
||||||
TotalRooms: 0,
|
TotalRooms: 0,
|
||||||
TotalListeners: len(manager.listeners),
|
TotalListeners: len(manager.listeners),
|
||||||
SocketsPerRoom: make(map[string][]string),
|
SocketsPerRoom: make(map[string][]string),
|
||||||
|
|
@ -89,6 +89,7 @@ func (manager *SocketManager) Metrics() ManagerMetrics {
|
||||||
metrics.SocketsPerRoom[roomId] = []string{}
|
metrics.SocketsPerRoom[roomId] = []string{}
|
||||||
}
|
}
|
||||||
metrics.SocketsPerRoom[roomId] = append(metrics.SocketsPerRoom[roomId], socketId)
|
metrics.SocketsPerRoom[roomId] = append(metrics.SocketsPerRoom[roomId], socketId)
|
||||||
|
metrics.TotalSockets++
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
return true
|
return true
|
||||||
|
|
@ -169,7 +170,6 @@ func (manager *SocketManager) dispatch(event SocketEvent) {
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-done:
|
case <-done:
|
||||||
fmt.Printf("dispatched event: %s\n", event.Type)
|
|
||||||
return
|
return
|
||||||
case <-time.After(5 * time.Second):
|
case <-time.After(5 * time.Second):
|
||||||
fmt.Printf("havent dispatched event after 5s, chan blocked: %s\n", event.Type)
|
fmt.Printf("havent dispatched event after 5s, chan blocked: %s\n", event.Type)
|
||||||
|
|
@ -193,6 +193,11 @@ func (manager *SocketManager) OnMessage(id string, message map[string]any) {
|
||||||
Payload: message,
|
Payload: message,
|
||||||
RoomId: socket.RoomId,
|
RoomId: socket.RoomId,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if message["message"] == "ping" {
|
||||||
|
manager.Ping(id)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (manager *SocketManager) Add(roomId string, id string, writer WriterChan, done DoneChan) {
|
func (manager *SocketManager) Add(roomId string, id string, writer WriterChan, done DoneChan) {
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,14 @@ func StartListener(locator *service.Locator) {
|
||||||
manager := service.Get[wsutil.SocketManager](locator)
|
manager := service.Get[wsutil.SocketManager](locator)
|
||||||
manager.Listen(socketMessageListener)
|
manager.Listen(socketMessageListener)
|
||||||
handler := NewMessageHandler(manager)
|
handler := NewMessageHandler(manager)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
|
handle(handler)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func handle(handler *MessageHandler) {
|
||||||
select {
|
select {
|
||||||
case event := <-serverSideMessageListener:
|
case event := <-serverSideMessageListener:
|
||||||
handler.OnServerSideEvent(event)
|
handler.OnServerSideEvent(event)
|
||||||
|
|
@ -21,17 +26,21 @@ func StartListener(locator *service.Locator) {
|
||||||
case wsutil.DisconnectedEvent:
|
case wsutil.DisconnectedEvent:
|
||||||
handler.OnSocketDisconnected(event)
|
handler.OnSocketDisconnected(event)
|
||||||
case wsutil.MessageEvent:
|
case wsutil.MessageEvent:
|
||||||
handlerId := event.Payload["id"].(string)
|
|
||||||
eventName := event.Payload["event"].(string)
|
handlerId, ok := event.Payload["id"].(string)
|
||||||
|
eventName, ok2 := event.Payload["event"].(string)
|
||||||
|
|
||||||
|
if !ok || !ok2 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
sessionId := session.Id(event.SessionId)
|
sessionId := session.Id(event.SessionId)
|
||||||
if eventName == "dom-element-removed" {
|
if eventName == "dom-element-removed" {
|
||||||
handler.OnDomElementRemoved(handlerId)
|
handler.OnDomElementRemoved(handlerId)
|
||||||
continue
|
return
|
||||||
} else {
|
} else {
|
||||||
handler.OnClientSideEvent(handlerId, sessionId)
|
handler.OnClientSideEvent(handlerId, sessionId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue