C++/Java 常用框架/架构

 设计 4+1视图

Use-Case View

  • 系统边界:
  • 系统用户:
  • 功能和场景:

Logical View

  Implementation View 实现视图或开发视图

Deployment View 中文称为部署视图,有时也称为物理视图。

C++ 套路:

1 内部通信:读写分离:一个线程写queue, 另一个线程while 无限循环从queue读取发送;
2 外部通信-网络通信:while+ epoll; epoll_in 的时候read,然后发送; 可以不用epoll_out ,使用也行标准一点.
while(1){ epollwait  case epollin: read,send socket }
3 路由中心handler:a) 基类接口(cascade) 转子类  b) msg(case type) 路由和业务分离
4 多态: eg:GPUimage实现框架,子filter实现具体功能.cascade 子类模块:carrier,card etc实现功能.
            两者都需要init的时候,确定子类type

实现

一 常用框架

notes: 哲学家用餐问题是高并发防止死锁.哲学家是多个线程,午餐是全局变量。

3种线程通信模型比较:

lockqueue唤醒分发优缺点
lock+signal/cond_wait
线程池不用lock.每个对象自己的

 
queue,不存在共用queue.唤醒:只需要调用线程池接口就算唤醒了。线程池内部自己唤醒线程,发送完就休眠。分发:不存在分发问题.queue在自己线程内,一个线程处理一个对象,一一对应不存在分发queue多了,多线程,多线程的唤醒和等待。
looper模型阻塞:epoll;用epoll监听queue.queue为空的阻塞情况交给os管理。
而epoll模型更合理一点,接收端监听queue。类似epoll监听socket,正在处理中,来了数据放入read socket的buffer中,下次到epoll的时候再读。
由os管理阻塞。写只需要写queue,读只需要读queue
分发:将msg.target 和对象绑定,所以msg不能分发错误.
线程唤醒是条件变量。looper唤醒到底是条件变量还是epoll呢?--看源码写
是不是共用一个queue.
比如 android:handler+thread.
对比:哪种更好呢?前者多核更好。线程池被封装好了,应用实现简单。后者cpu小的android更好?后者也应该是封装好了,android中是looper,只是c++中不知道是什么api接口.
epoll这个新设计,需要学习比lock+cond_wait那个组合好像是,lock少,还有什么好处呢?

MVC,MVP,MVVM关系?应常用架构:MVC模式(Model–vi

有了MVP(Model–view–presenter),presenter不仅要操作数据,而且要更新view;(断开了MVC中的M和V连接)再到MVVM(Model-View-ViewModel)解决了MVP大量的手动View和Model同步的问题,提供双向绑定机制。(控件绑定变量,可以前端实现验证功能).
mvc在网页时代为什么没有这个问题,而android存在呢?
因为网页时代,前端就可以加载动态网页,没有activity,不同于移动互联网中在xml中配置,静态和动态网页分离??
mvc,mvp,mvvp 实例:https://blog.csdn.net/carson_ho/article/details/100070

二 实例分析:

web+android常用框架

1 web 到后台框架.
 webpage:localaccount.ts(saveid)--- rest-executor.ts (service: it is to send rest, reset keyword "/security/username") ----rest router(RestApplication.java/SecurityRouter.java)
----rest class(UsernameResource.java)---class keyword( @Post("json") to find function:changeUsername----m_authServiceHandler.changeUsername )
----AndroidCommon service(from rest to AndroidCommon:AuthServiceHandler.java)
----use service to call aidl and pass callback listener1( getService().changeUsername)
----facadeService(use aidl from AndroidCommon to facade: AuthenticationServiceImpl.java changeUsername)

后台logic:call ladder
facadeService传入username给native层(c++)---
database
--result传回给facade new的listener2的onRequestComplete处理
---onRequestComplete传回给AndroidCommon lister1(listener.onChangeCredentials)

2  层与层交互request/respond,通常不是send,receive.而是采用传递一个callback function的listener下去,然后将结果带回来。

/*android 都是采用这种框架,框架message传回value的一种了。
传入listener作为callback函数,子线程调用onConfigData传入参数,主线程接收参数*/
  mConfigHandler.getConfig(new ConfigServiceListener() {
            @Override
            public void onConfigData(boolean isNotification, ConfigData... configDatas) {
                current = isNotification;
                    ......    
            }, true, keys);
 }

3  异步发送data:一个线程写,一个线程读然后发送.
优先:不需要等慢速的socket 读写,main(write) thread放完数据,可以继续干别的活了。

writeToAgent(msg);//write queue interface
private void writeToAgent(String msg) {
        synchronized (mMessageQueue)  {
             //main(write) thread put msg into queue
          mMessageQueue.add(msg);
}}
new Thread(mLoop).start();//read thread start
private Runnable mLoop = new Runnable() {
    @Override
    public void run() {
            List<String> availableMessages = new ArrayList<>();
            String listMsg = null;
            // Send out any queued event messages
           synchronized (mMessageQueue) {
                   //read queue
                  mMessageQueue.drainTo(availableMessages);
           }
         while (!availableMessages.isEmpty()) {
             listMsg = availableMessages.remove(0);
              //send msg
             writeToSocket(listMsg);
        }
}

三 Windows消息机制(鼠标到界面到消息处理)


Windows 消息以及消息处理算法--线程和消息队列详解 https://blog.csdn.net/jadeshu/article/details/85054929
这篇blog介绍了从驱动线程获取消息发送到UI线程queue. 即getmessage的源码。没有消息的情况使用Multiwait等待.
https://blog.csdn.net/lyrebing/article/details/50067937---给下游窗体的发送----应用层分开

Handler机制与MFC机制

MFC机制:界面信号-槽;
消息:控件绑定onclick事件. 事件转成消息,放入消息队列,循环读取并分发。
模拟消息队列+消息和事件的关系https://zhidao.baidu.com/question/1574807518758000500.html
Android也是界面同MFC. findViewById(R.id.record).setOnClickListener(btn_camera_operate);
界面也是类似Qt的信号-槽机制。多个信号,注册到一个click listener。观察者模式。
Handler机制消息也是queue,循环分发。
Android sendMessage和vc的sendmessage一样的.

other: 

1 服务端高并发分布式架构演进之路:https://segmentfault.com/a/1190000018626163

nots:比较14张图的变化就可以了

2 10种常见的软件架构模式 https://www.cnblogs.com/IcanFixIt/p/7518146.html

补充:系统设计:
https://github.com/zhiyong0804/game_service_system
base lib, connect lib, db operator lib, develop frame, and game engine, game frame game service system! 从0开始开发 基础库(配置文件读写、日志、多线程、多进程、锁、对象引用计数、内存池、免锁消息队列、免锁数据缓冲区、进程信号、共享内存、定时器等等基础功能组件),网络库(socket、TCP、UDP、epoll机制、连接自动收发消息等等),数据库操作库(mysql,redis、memcache API 封装可直接调用),开发框架库(消息调度处理、自动连接管理、服务开发、游戏框架、服务间消息收发、消息通信等等),消息中间件服务(不同网络节点间自动传递收发消息)等多个功能组件、服务,最后完成一套完整的服务器引擎,基于该框架引擎可开发任意的网络服务。 主体架构:N网关+N服务+N数据库代理+内存DB(Redis、MemCache)+Mysql数据库,基于该架构可建立集群,稳定高效的处理大规模、高并发消息。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值