开源项目

swoft  基于swoole协程的高性能PHP微服务框架,内置http服务器。框架全协程实现,性能完胜传统的php-fpm模式。
aversion 服务端App版本迭代识别,根据客户端参数识别当前迭代分支版本

1. 结构体

1. 结构体定义和使用

结构体是一组函数、变量的聚合体,是实现go语言中面向对象编程的重要结构。这一点和C++中的结构体有基本等同的作用,只不过一点区别是 C++结构体中的this指针,在golang结构体中并不存在,需要我们显示明。

type  Point struct{
      x float64 
      y  float64
}

// this 变量名称可以随意定义
func (this*Point) SetPoint(x,y float64){
     this.x=x 
     this.y=y
} 


// 结构体的定义 和初始化

type  Point struct{
      x float64 
      y  float64
}

func (this*Point) SetPoint(x,y float64){
     this.x=x 
     this.y=y
} 

pt:=Point{}                                  //值类型不带初始化列表
var pt=Point{x:1.0,y:1.3}                //值类型带初始化列表
var pt=Point{1.1,1.2}                  //值类型带初始化列表
    

pt.SetPoint(1.2,5) //调用结构体对象的SetPoint方法

阅读全文

1. 变量

1.1 变量的声明通过var 关键字

var a int      
var a float32
var a float64
var a int32 
var a byte 
var str string 

var arr1 []string
var arr2 []int32

var mp map[string]string

var p *int 

var  cmplx  complex64

阅读全文

mysql各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。

行级锁

行级锁定是目前各大数据库管理软件所实现的锁定颗粒度最小的,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。

但是由于锁定资源的颗粒度很小,所以每次获取锁和释放锁消耗的资源也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。

表级锁

表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免死锁问题。

当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并发度较低。

页级锁

页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。

在MySQL数据库中,使用表级锁定的主要是MyISAM,Memory,CSV等一些非事务性存储引擎,而使用行级锁定的主要是Innodb存储引擎和NDBCluster存储引擎,页级锁定主要是BerkeleyDB存储引擎的锁定方式。

阅读全文

  1. 请求入口文件index.php
  2. 加载配置文件和创建application
  3. request组件解析请求route
  4. 创建controller处理请求
  5. 创建action,执行action过滤器
  6. 过滤器执行通过,action执行,反之
  7. 业务数据处理
  8. 显示视图
  9. 返回一个response组件
  10. 执行repsone发送结果到浏览器

阅读全文

为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。客户端不需要知道系统内部的复杂联系,整个系统只需提供一个”接待员”即可。

阅读全文

服务容错的设计有个基本原则,在设计上需要考虑到各种边界场景和对于服务间调用出现的异常或延迟情况,同时在设计和编程时也要考虑周到。这一切都是为了达到以下目标:

  1. 一个依赖服务的故障不会严重破坏用户的体验。
  2. 系统能自动或半自动处理故障,具备自我恢复能力。

基于这个原则和目标,衍生出一些模式,能够解决分布式服务调用中的一些问题,提高系统在故障发生时的存活能力。

模式:其实就是某种场景下一类问题及其解决方案的总结归纳,往往可以重用。模式可以指导我们完成任务,作出合理的系统设计方案,达到事半功倍的效果。

阅读全文

共享内存是一种在同一台机器的不同进程(应用程序)之间交换数据的方式。一个进程可创建一个可供其他进程访问的内存段,并赋予它相应的权限。每个内存段拥有一个惟一的ID,我们通常称之为shmid,这个ID指向一个物理内存区域,其他进程可通过此ID来操作这块内存, 包扩读取、写入以及删除。

共享内存的使用是一种在进程之间交换数据的快速方法,主要因为在创建内存段之后传递数据,不会涉及内核。这种方法常常称为进程间通信 (IPC)。其他 IPC 方法包括管道、消息队列、RPC 和套接字。使用共享内存需要考虑操作的原子性和锁、并行和互斥。

共享内存方案

APC缓存

APC 可以缓存 PHP 的 opcode 提高应用的性能,可以在同个 PHP-FPM 进程池的进程间共享数据。

Shmop Unix

ipcs -m 查看本机共享内存的状态和统计。 ipcrm -m shmid 或 ipcrm -M shmkey 清除共享内存中的数据。

阅读全文

很多时候,业务有“在一段时间之后,完成一个工作任务”的需求。

例如:滴滴打车订单完成后,如果用户一直不评价,48小时后会将自动评价为5星。一般来说怎么实现这类“48小时后自动评价为5星”需求呢?

常见方案

启动一个cron定时任务,每小时跑一次,将完成时间超过48小时的订单取出,置为5星,并把评价状态置为已评价。

方案的不足

  1. 轮询效率比较低
  2. 每次扫库,已经被执行过记录,仍然会被扫描(只是不会出现在结果集中),有重复计算的嫌疑
  3. 时效性不够好,如果每小时轮询一次,最差的情况下,时间误差会达到1小时
  4. 如果通过增加cron轮询频率来减少(3)中的时间误差,(1)中轮询低效和(2)中重复计算的问题会进一步凸显

如何利用“延时消息”,对于每个任务只触发一次,保证效率的同时保证实时性。

阅读全文

Consul 是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件, Go 语言开发。consul相比其它有如下优点。

  • 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft.
  • 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持.
  • 支持健康检查. etcd 不提供此功能.
  • 支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议.
  • 官方提供web管理界面, etcd 无此功能.

阅读全文