Hi Maxim, I am glad you have found the problem! And that it is not in Wicket! :-)
Martin Grigorov Wicket Training and Consulting Looking for a remote position with Wicket ? Contact me! https://twitter.com/mtgrigorov On Fri, Mar 16, 2018 at 12:02 PM, Maxim Solodovnik <solomax...@gmail.com> wrote: > Here are the result of my investigation: Wicket is super fast on WebSockets > All my performance issues were caused by bad performance of Hazelcast IMap > (I have used default configuration) > > Sorry for the noise > > > On Thu, Mar 15, 2018 at 11:29 PM, Maxim Solodovnik <solomax...@gmail.com> > wrote: > > > 20 users has same pageId == 0, different sessionId, so page instances > are > > different > > I thought the issue is caused by NoVersionMapper, but this seems to not > > the case ..... > > Will continue debugging > > Any hints/pointers are highly appreciated > > > > On Thu, Mar 15, 2018 at 3:12 PM, Maxim Solodovnik <solomax...@gmail.com> > > wrote: > > > >> Hello Martin, > >> > >> Here are code examples (maybe I'm misusing something) > >> > >> I'm adding WebSocketBehavior to our MainPanel [1] > >> I'm using following code [2] to send messages to all "room clients" > (send > >> to subset of IWebSocketConnectionRegistry) > >> > >> To test I'm running 20 chromium browsers with clean and initially empty > >> temp workspaces (being dropped on each run) > >> > >> I also have added sort of timing (basic implementation log.warn of the > >> result of System.currentTimeMillis()) > >> > >> default solution [2] totally blocks UI and logs maximum working > >> time: 90.966sec > >> > >> So I did [3] (basically move all sending code to new Thread) > >> This partially unblock UI and slightly reduces delays (the maximum > >> reported is 78.373sec) > >> > >> Next I tried to add custom executor: > >> WebSocketSettings.Holder.get(this).setSendPayloadExecutor(new > Executor() > >> { > >> @Override > >> public void run(Runnable command) { > >> final WebSession ws = WebSession.get(); > >> final RequestCycle rc = RequestCycle.get(); > >> new Thread(() -> { > >> ThreadContext.setApplication(Application.this); > >> ThreadContext.setSession(ws); > >> ThreadContext.setRequestCycle(rc); > >> command.run(); > >> }).start(); > >> } > >> }); > >> > >> This totally break everything and all I got it is " > >> CouldNotLockPageException" exceptions ... > >> > >> Maybe my code for message sending is invalid? > >> > >> [1] https://github.com/apache/openmeetings/blob/4.0.x/openme > >> etings-web/src/main/java/org/apache/openmeetings/web/ > >> common/MainPanel.java#L133 > >> [2] https://github.com/apache/openmeetings/blob/4.0.2/openme > >> etings-core/src/main/java/org/apache/openmeetings/core/util/ > >> WebSocketHelper.java#L241 > >> [3] https://github.com/apache/openmeetings/blob/4.0.x/openme > >> etings-core/src/main/java/org/apache/openmeetings/core/util/ > >> WebSocketHelper.java#L244 > >> > >> On Thu, Mar 15, 2018 at 2:56 PM, Martin Grigorov <mgrigo...@apache.org> > >> wrote: > >> > >>> Hi Maxim, > >>> > >>> Each WebSocket connection locks only one page instance for the > processing > >>> time. > >>> > >>> "20+ simultaneous connects" - I guess this is 20 connections by > different > >>> users, not 20 in the same page instance, right ? > >>> Because I do not expect 20 different users to interfere to each other. > >>> > >>> Martin Grigorov > >>> Wicket Training and Consulting > >>> Looking for a remote position with Wicket ? Contact me! > >>> https://twitter.com/mtgrigorov > >>> > >>> > >>> On Thu, Mar 15, 2018 at 7:58 AM, Maxim Solodovnik < > solomax...@gmail.com> > >>> wrote: > >>> > >>> > Hello All, > >>> > > >>> > I'm trying to migrate from WebSocketBehavior to WebSocketResource due > >>> to > >>> > huge performance degradation starting 20+ simultaneous connects > >>> > Right now I see no way to process the messages "per client" > >>> > > >>> > Maybe it would be possible to have the power of these 2 approaches? > >>> > Or maybe there is the way to reduce lock time? > >>> > > >>> > I tried to implement > >>> > multi-threaded WebSocketSettings.Holder.get(t > >>> his).setSendPayloadExecutor, > >>> > but this leads to lots of CouldNotLockPageException ... > >>> > > >>> > > >>> > On Thu, Mar 1, 2018 at 3:41 PM, Maxim Solodovnik < > solomax...@gmail.com > >>> > > >>> > wrote: > >>> > > >>> > > Hello Martin, > >>> > > > >>> > > Thanks a lot for the answer > >>> > > I do remember it was discussed, and I do remember WebSocketResource > >>> is > >>> > > more performant, > >>> > > this is why i thought it would be good to have "resource" for > speedy > >>> > > json and "behavior" for component updates etc. > >>> > > > >>> > > This is also mentioned in guide: > >>> > > https://ci.apache.org/projects/wicket/guide/8.x/single.html# > >>> _how_to_use > >>> > > > >>> > > "Wicket allows one thread at a time to use a page instance to > >>> simplify > >>> > > the usage of the pages in multithreaded enviroment. When a > WebSocket > >>> > > message is sent to a page Wicket needs to acquire the lock to that > >>> > > page to be able to pass the IWebSocketMessage to the > >>> > > WebSocketBehavior. This may be problematic when the application > needs > >>> > > to send many messages from the client to the server. For this > reason > >>> > > Wicket provides WebSocketResource" > >>> > > > >>> > > > >>> > > > >>> > > On Thu, Mar 1, 2018 at 2:04 AM, Martin Grigorov > >>> > > <martin.grigo...@gmail.com> wrote: > >>> > > > Hi Maxim, > >>> > > > > >>> > > > This has been discussed in the past. > >>> > > > Please search the archives. > >>> > > > I see no reason why to have more than one connection per page. > >>> > > > > >>> > > > On Feb 28, 2018 19:44, "Maxim Solodovnik" <solomax...@gmail.com> > >>> > wrote: > >>> > > > > >>> > > >> It seems ConnectionRegistry should also be changed in the case > of > >>> 2 or > >>> > > >> more websockets are opened :( > >>> > > >> will try with one websocket for now ... > >>> > > >> > >>> > > >> sorry for the noise > >>> > > >> > >>> > > >> On Thu, Mar 1, 2018 at 12:38 AM, Maxim Solodovnik < > >>> > solomax...@gmail.com > >>> > > > > >>> > > >> wrote: > >>> > > >> > Hello All, > >>> > > >> > > >>> > > >> > As far as I can see from the code > >>> > > >> > right now it is not possible to have multiple WebSockets on > the > >>> page > >>> > > >> > > >>> > > >> > WebSocketResource and WebSocketBehavior > >>> > > >> > > >>> > > >> > Maybe it worth to extends API to allow such configuration? > >>> > > >> > I can create PR :) > >>> > > >> > > >>> > > >> > -- > >>> > > >> > WBR > >>> > > >> > Maxim aka solomax > >>> > > >> > >>> > > >> > >>> > > >> > >>> > > >> -- > >>> > > >> WBR > >>> > > >> Maxim aka solomax > >>> > > >> > >>> > > > >>> > > > >>> > > > >>> > > -- > >>> > > WBR > >>> > > Maxim aka solomax > >>> > > > >>> > > >>> > > >>> > > >>> > -- > >>> > WBR > >>> > Maxim aka solomax > >>> > > >>> > >> > >> > >> > >> -- > >> WBR > >> Maxim aka solomax > >> > > > > > > > > -- > > WBR > > Maxim aka solomax > > > > > > -- > WBR > Maxim aka solomax >